我的解法:
将字符串反转开始比较。
- C++
class Solution {
public:string makeSmallestPalindrome(string s) {string a = s, b = s;reverse(b.begin(), b.end());int n = s.size();for (int i = 0; i < n; ++i) {if (a[i] != b[i]) {a[i] = b[i] = min(a[i], b[i]);a[n - i - 1] = b[n - i - 1] = a[i];}}return a;}
};
- Java
现在开始联系用Java写代码
在改写Java的过程中发现可以对上述思路进行简化,不需要两个字符串,直接首尾相互比较即可(相当于双指针)
class Solution {public String makeSmallestPalindrome(String s) {char[] a = s.toCharArray();int n = s.length();for (int i = 0; i < n; ++i) {if (a[i] != a[n - i - 1]) {a[i] = a[n - i - 1] = (char) Math.min(a[i], a[n - i - 1]);}}return new String(a);}
}
注意:
- 将
String
类型转换为可以逐字符访问的字符数组使用toCharArray()
- 字符串可以使用
.length()
访问长度,字符数组不可以 - 使用
min
函数要调用Math
库,另外注意将比较后的数字转换为字符类型(char)
- 最后要返回字符串,所以要进行强制转换,
String
是一个类,所以要用new