题目描述
小D拿到了一个仅由 "abc" 三种字母组成的字符串。她每次操作会对所有字符同时进行以下变换:
- 将
'a'变成'bc' - 将
'b'变成'ca' - 将
'c'变成'ab'
小D将重复该操作 k 次。你的任务是输出经过 k 次变换后,得到的最终字符串。
例如:对于初始字符串 "abc",执行 2 次操作后,字符串将变为 "caababbcbcca"。
测试样例
样例1
输入:s = "abc", k = 2
输出:'caababbcbcca'
样例2
输入:s = "abca", k = 3
输出:'abbcbccabccacaabcaababbcabbcbcca'
样例3
输入:s = "cba", k = 1
输出:'abcabc'
思路
- 字符串变换:需要对字符串中的每个字符进行变换。由于变换是同时进行的,因此可以从后往前遍历字符串,避免在变换过程中影响到尚未处理的字符。
- 使用 StringBuffer:为了方便地修改字符串,使用
StringBuffer来存储变换后的结果。 - 循环变换:重复执行变换操作
k次。在每次变换中,遍历当前字符串的每个字符,根据变换规则生成新的字符串。
Java代码
public class Main {
public static String solution(String s, int k) {
// write code here
StringBuffer sb = new StringBuffer(s);
int i = 0;
while (k > 0) {
for (i = s.length() - 1; i >= 0; i -- ) {
if (s.charAt(i) == 'a') {
sb.replace(i, i + 1, "bc");
} else if (s.charAt(i) == 'b') {
sb.replace(i, i + 1, "ca");
} else if (s.charAt(i) == 'c') {
sb.replace(i, i + 1, "ab");
}
}
s = sb.toString();
k -- ;
}
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"));
}
}
复杂度分析
时间复杂度:每次变换的时间复杂度为 O(n),其中 n 是当前字符串的长度。由于需要进行 k 次变换,因此总的时间复杂度为 O(k * n)。在最坏情况下,字符串长度会随着变换而指数增长,但在实际应用中,k 的值通常不会太大。
空间复杂度:每次变换都使用了一个新的 StringBuffer 来存储变换后的结果,因此空间复杂度为 O(n),其中 n 是变换后的字符串长度。由于字符串长度在变换过程中会增长,因此在最坏情况下,空间复杂度也可能达到 O(n * 2^k)。