合法字符串

用n个不同的字符(编号1 - n),组成一个字符串,有如下2点要求:

1、对于编号为i的字符,如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符;

2、对于编号为i的字符,如果2 * i <= n,则该字符不可以作为最后一个字符,且该字符后面所紧接着的下一个字符的编号一定要大于2 * i。

问:有多少长度为M且符合条件的字符串。

例如:N = 2,M = 3。则abb,bab,bbb是符合条件的字符串。剩下的均为不符合条件的字符串。


#define N 4
#define M 5

void findValidStr(char* elems, char* result, int pos) {
    if (pos == M) {
        result[M] = '\0';
        puts(result);
    } else {
        if (pos == 0) {
            int i = pos;
            for (i = pos; i < N; i++) {
                result[pos] = elems[i];
                findValidStr(elems, result, pos + 1); 
            }   
        } else {
            int i = 0;
                
            int lastI = result[pos - 1] + 1 - 'a';
                
            if (lastI * 2 <= N) {
                i = lastI;
            }   
                
            if (pos == M - 1) {
                if (i != lastI) {
                    i = N / 2;
                }else if(2*i<=N)
                {   
                    i = N / 2;
                }   
            }   
                
            for (; i < N; i++) {
                result[pos] = elems[i];
                findValidStr(elems, result, pos + 1); 
            }   
        }   
    }   
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值