题干
力扣38外观数列
解题代码
我的通过代码
class Solution {
public String countAndSay(int n) {
if(n==1)
{
return "1";
}
String[] pd = new String[2];
pd[0] = "1";
pd[1] = "11";
for(int i=2;i<n;i++)
{
pd[i%2] = "";
int j=0,index = 0;
for(;j<pd[(i+1)%2].length();j++)
{
if(pd[(i+1)%2].charAt(j)!=pd[(i+1)%2].charAt(index))
{
pd[i%2] += String.valueOf(j-index)+String.valueOf(pd[(i+1)%2].charAt(j-1));
index = j;
}
}
pd[i%2] += String.valueOf(j-index)+String.valueOf(pd[(i+1)%2].charAt(j-1));
}
return pd[(n-1)%2];
}
}
官方解答
class Solution {
public String countAndSay(int n) {
String str = "1";
for (int i = 2; i <= n; ++i) {
StringBuilder sb = new StringBuilder();
int start = 0;
int pos = 0;
while (pos < str.length()) {
while (pos < str.length() && str.charAt(pos) == str.charAt(start)) {
pos++;
}
sb.append(Integer.toString(pos - start)).append(str.charAt(start));
start = pos;
}
str = sb.toString();
}
return str;
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/count-and-say/solution/wai-guan-shu-lie-by-leetcode-solution-9rt8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
解题思路
题干中很明显能看出这是一道基于动态规划的题目,已经给出了动态规划方程。难点在于题干的理解,但是仔细阅读就能发现这道题的本质就是统计字符串中相邻相同字符。
通过将我的解答与官方解答相对比:
在时间复杂度上,我的解答与官方解答相差不大,虽然官方解答使用了三层循环嵌套,但是内置的两层循环本质是有同一个下标控制,即可视为一层循环。
在空间复杂度上,我的解答在字符串操作上一直使用的是String,在空间上造成了较大的浪费,而官方解答使用的是Stringbuild,在操作过程中不会产生新的对象,空间性能要更优。
在可读性上,我的代码看起来要更为复杂,官方解答要更加简洁。