找到第n个count-and-say序列元素

时间:2012-05-28 08:53:38

标签: c string algorithm

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提前

1 个答案:

答案 0 :(得分:6)

您可以使用动态编程。一段时间后,您将遇到已经计算过的已存在的子串。您可以保留已计算序列的映射:

1 -> 11
11 -> 21

现在您需要计算1211

您首先选择的是1,您已经知道的是11

您遇到2。你没有这个,所以计算12并将其添加到地图中:

2 -> 12

您遇到11,您在地图中再次遇到21

连接这些并获得

111221

和新地图

1 -> 11
11 -> 21
2 -> 12

编辑:你只查找连续相同的数字,所以只保留在地图中。