小红的 red 串

[题目链接](https://www.nowcoder.com/practice/b8e19a2c1d454a8897f2155d74304185)

思路

字符串仅由 'r''e''d' 三种字符组成,要求同时进行如下替换:

  • 'r''e'
  • 'e''d'
  • 'd''r'

由于变化是同时发生的,不能原地逐个替换后影响后续字符(实际上这里每个字符的替换互不影响,因为每个字符只看自身原始值)。直接遍历字符串,对每个字符按映射关系输出即可。

样例演示

输入 "rredd"

  • re
  • re
  • ed
  • dr
  • dr

输出 "eedrr",与预期一致。

代码

class Solution {
public:
    string change(string mystr) {
        for (int i = 0; i < mystr.size(); i++) {
            if (mystr[i] == 'r') mystr[i] = 'e';
            else if (mystr[i] == 'e') mystr[i] = 'd';
            else mystr[i] = 'r';
        }
        return mystr;
    }
};
import java.util.*;

public class Solution {
    public String change(String mystr) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < mystr.length(); i++) {
            char c = mystr.charAt(i);
            if (c == 'r') sb.append('e');
            else if (c == 'e') sb.append('d');
            else sb.append('r');
        }
        return sb.toString();
    }
}

复杂度分析

  • 时间复杂度,其中 为字符串长度。遍历一次字符串即可完成替换。
  • 空间复杂度。C++ 原地修改输入字符串,额外空间 ;Java 使用 StringBuilder 构造新字符串,需要 空间。