字符串分段的组合Combine算法,紧急求救,高手快来!!!

icesky 2013-12-17 11:10:46
比如一个英语单词,单词长度为n,我要将其分成m段,得到所有分段的结果。。。
这可以看成一个组合题,可以理解为在n-1个位置上插入m-1个分隔符,即(n-1),(m-1)的组合。

比如单词forum分为3段,有(4*3)/2=6种分法,即
1、f o rum
2、f or um
3、f oru m
4、fo r um
5、fo ru m
6、for u m

我需要用C语言实现这样一个算法,打印出每个类似“f or um”的结果。本人算法不精,请高手帮忙,多谢!!!
在网上下了很多组合算法,没一个和我的需求相符的,只好到论坛求教。。。谢谢!!!
...全文
181 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
icesky 2013-12-20
  • 打赏
  • 举报
回复
引用 3 楼 uuuououlcz 的回复:
考虑: (1)如果n < m,不行 (2)如果n >= m,先考虑最左边的第1段,则第1段的长度len1可以是[1,n-(m-1)],这是因为后面至少要有m-1个字符用于分成m-1段,这样问题就化为长度为n-len1的字符串分成m-1段的子问题 以下代码仅供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sliceUp(int segmentLength[], int index, const char* s, int remainingLength, int remainingPart)
{
    if(remainingPart == 1){
        segmentLength[index++] = remainingLength;
        int i, j, len;
        for(i = 0; i < index; ++i){
            if(i) putchar(' ');
            for(j = 0, len = segmentLength[i]; j < len; ++j){
                putchar(s[j]);
            }
            s += segmentLength[i];
        }
        puts("");
        return;
    }
    int len = 1, limit = remainingLength - (remainingPart-1);
    for(; len <= limit; ++len){
        segmentLength[index] = len;
        sliceUp(segmentLength, index+1, s, remainingLength-len, remainingPart-1);
    }
}

int printCuts(const char* s, int parts)
{
    int len = strlen(s);
    if(len < parts) return -1;

    int* arr = (int*)malloc(parts * sizeof(int));
    sliceUp(arr, 0, s, len, parts);
    free(arr);

    return 1;
}

int main()
{
    printCuts("forum", 3);

    return 0;
}
完美的解决了我的问题,注释简明扼要,代码规范有效。。。。谢谢!!!
terhack 2013-12-18
  • 打赏
  • 举报
回复
分成三段扩展两个char说错了
terhack 2013-12-18
  • 打赏
  • 举报
回复
先将字符串进行扩展空间,比如分成3段就扩展一个char,然后插入2个空格 然后是第一个分段,第一个分段的长度需要确定,保证最后的字符至少是2个(3-1) 然后对剩下的字符进行分成2段 递归可以实现
还有多远 2013-12-18
  • 打赏
  • 举报
回复
考虑: (1)如果n < m,不行 (2)如果n >= m,先考虑最左边的第1段,则第1段的长度len1可以是[1,n-(m-1)],这是因为后面至少要有m-1个字符用于分成m-1段,这样问题就化为长度为n-len1的字符串分成m-1段的子问题 以下代码仅供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void sliceUp(int segmentLength[], int index, const char* s, int remainingLength, int remainingPart)
{
    if(remainingPart == 1){
        segmentLength[index++] = remainingLength;
        int i, j, len;
        for(i = 0; i < index; ++i){
            if(i) putchar(' ');
            for(j = 0, len = segmentLength[i]; j < len; ++j){
                putchar(s[j]);
            }
            s += segmentLength[i];
        }
        puts("");
        return;
    }
    int len = 1, limit = remainingLength - (remainingPart-1);
    for(; len <= limit; ++len){
        segmentLength[index] = len;
        sliceUp(segmentLength, index+1, s, remainingLength-len, remainingPart-1);
    }
}

int printCuts(const char* s, int parts)
{
    int len = strlen(s);
    if(len < parts) return -1;

    int* arr = (int*)malloc(parts * sizeof(int));
    sliceUp(arr, 0, s, len, parts);
    free(arr);

    return 1;
}

int main()
{
    printCuts("forum", 3);

    return 0;
}
赵4老师 2013-12-18
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#include <string.h>
char *a="abcde";
int L,i,j,k;
void main() {
    L=strlen(a);
    for (i=1;i<=L;i++) {
        for (j=0;j<=L-i;j++) {
            for (k=j;k<j+i;k++) {
                printf("%c",a[k]);
            }
            printf("\n");
        }
    }
}
lm_whales 2013-12-17
  • 打赏
  • 举报
回复
走楼梯+抽屉原理。
lm_whales 2013-12-17
  • 打赏
  • 举报
回复
这个似乎和走楼梯,走台阶差不多。

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧