合法字符串

本文介绍了一种基于特定规则的字符串组合算法,利用递归方法生成所有可能的字符串组合,确保每个组合都符合给定的规则:字符的排列顺序受到其编号的影响,并限制了哪些字符可以出现在字符串末尾。

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

  • 1、对于编号为i 的字符,如果2 * i > n,则该字符可以作为最后一个字符,但如果该字符不是作为最后一个字符的话,则该字符后面可以接任意字符;
  • 2、对于编号为i的字符,如果2 * i <= n,则该字符不可以作为最后一个字符,且该字符后面所紧接着的下一个字符的编号一定要 >= 2 * i。

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

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

假定n和m皆满足:2<=n,m<=1000000000)。

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

#define N 2
#define M 3

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;
				}
			}
			for (; i < N; i++) {
				result[pos] = elems[i];
				findValidStr(elems, result, pos + 1);
			}
		}
	}
}

int main(void) {
	char elems[N] = { 'a', 'b' };
	char result[M + 1];

	int i = 0;
	for (; i < N; i++) {
		elems[i] = 'a' + i;
	}

	findValidStr(elems, result, 0);
	return EXIT_SUCCESS;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值