Given a problem, the count-and-say sequence is the sequence of integers beginning as follows:
1, 11, 21, 1211, 111221, ...
1被读作“1”或11。 11被读作“两个1”或21。 21被读作“一个2,然后一个1”或1211。 给定整数n,生成第n个序列。
我通过扫描每个字符串并相应地生成下一个字符串来制定解决方案 O(nm)需要时间 其中m是最大字符串的长度 和n是给定的数字
这是代码
void countnsay(char str[][1000],int n)
{
int i=1,k;
int j=0;
while(i<=(n-1))
{
//scan str[i-1]
j=0;
k=0; //for building the new string array
while(j<strlen(str[i-1]) )
{
char c=str[i-1][j];
int cnt=1;
while(c==str[i-1][++j])
cnt++;
str[i][k++]=cnt+48;
str[i][k++]=c;
}
str[i][k]='\0';
i++;
}
printf("%s",str[n-1]);
}
int main()
{
int n=5;
char str[1000][1000];
strcpy(str[0],"1");
countnsay(str,n);
return 0;
}
这个问题能有更好的解决方案吗? 请提供一些建议/提示。 Thanx提前
答案 0 :(得分:6)
您可以使用动态编程。一段时间后,您将遇到已经计算过的已存在的子串。您可以保留已计算序列的映射:
1 -> 11
11 -> 21
现在您需要计算1211
。
您首先选择的是1
,您已经知道的是11
。
您遇到2
。你没有这个,所以计算12
并将其添加到地图中:
2 -> 12
您遇到11
,您在地图中再次遇到21
。
连接这些并获得
111221
和新地图
1 -> 11
11 -> 21
2 -> 12
编辑:你只查找连续相同的数字,所以只保留在地图中。