题目要求
小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换:
- 将
'a'变成'bc' - 将
'b'变成'ca' - 将
'c'变成'ab'
小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。
思路分析
本题的核心在于每次操作都会使字符串长度翻倍,操作次数增加,字符串长度会以指数级增长。因此:
- 若直接构造整个字符串,随着 kkk 值增大,内存占用和运行时间都会迅速增大。
- 可通过逐次迭代操作的方法,利用
StringBuilder来拼接字符串,确保每次操作的结果都准确无误。 -
图解分析
以输入 s = "abc" 和 k = 2 为例:
-
第 1 次操作:
初始字符串s = "abc"'a'→'bc''b'→'ca''c'→'ab'
经过第 1 次操作后,字符串变为:
"bccab" -
第 2 次操作: 新字符串
s = "bccab"'b'→'ca''c'→'ab''c'→'ab''a'→'bc''b'→'ca'
经过第 2 次操作后,最终得到字符串为:
"caababbcbcca"
代码实现
public class Main {
public static String solution(String s, int k) {
// write code here
for(int i=1;i<=k;i++){
StringBuilder next = new StringBuilder(); // 用于存储新的字符串
for(int j=0;j<s.length();j++){
// 根据字符的不同添加不同的替换字符串
if (s.charAt(j) == 'a') {
next.append("bc");
} else if (s.charAt(j) == 'b') {
next.append("ca");
} else if (s.charAt(j) == 'c') {
next.append("ab");
}
}
// 更新 s 为当前操作完成后的字符串
s = next.toString();
}
return s;
}
public static void main(String[] args) {
System.out.println(solution("abc", 2).equals("caababbcbcca"));
System.out.println(solution("abca", 3).equals("abbcbccabccacaabcaababbcabbcbcca"));
System.out.println(solution("cba", 1).equals("abcabc"));
}
}
知识总结
- StringBuilder 的使用:在处理大量字符串拼接操作时,
StringBuilder的效率远高于直接使用字符串。每次append操作不会创建新的字符串对象,从而节省了内存和时间。 - 字符串替换策略:对于递归替换的问题,注意每次替换后的字符串结构,记录并观察字符串的模式是否有规律性。
- 指数增长规律:当字符串长度在每次操作后按倍数增长时,需要谨慎处理大规模数据,避免内存占用过大。
学习建议
- 入门建议:建议刚入门同学从简单的字符串操作入手,比如字符替换、拼接等,逐步理解
StringBuilder的优势。 - 尝试不同实现:可以尝试用递归、迭代和记忆化等不同方法实现该题目,了解不同实现方式的性能差异。
- 总结规律:观察题目中出现的规律性,在理解规律的基础上,可以避免直接模拟,提升代码效率。
个人思考
这道题目,和我昨天写的那个题目有相似之处,都用到了charAt()函数,用于遍历单个字符串。由于我是初学者,昨天刚学到这个charAt()函数,今天就直接想到了,算是一种进步吧哈哈!!今天又学到了StringBuilder对象!!