Leetcode -- 2697. 字典序最小回文串
Problem: 2697. 字典序最小回文串
思路
本文大致的实现思路就是使用双指针的方式,前后指针同时向中间收缩;在收缩的过程中如果遇到前后指针所对应的值不相等取其中的较小值即可。
解题方法
将字符串转为数组或者新建一个数组其长度和字符串一致,设置两个"指针"分别指向数组的起始和末尾的位置,通过循环遍历将两个指针依次往中间靠拢收缩,当前指针>=后指针的即可退出循环。
在遍历的过程中:
- 将字符串转为数组arr
if (arr[right] < arr[left]) {
arr[left] = arr[right];
} else {
arr[right] = arr[left];
}- 新建一个数组arr其长度和字符串一致
if (s.charAt[right] < s.charAt[left]) {
arr[left] = arr[right] = s.charAt(right);
} else {
arr[right] = arr[left] = s.charAt(left);
}出循环后还须在判断一下:(否者会出现中间为空的情况)
if (left == right) {
arr[right] = arr[left] = s.charAt(left);
}
复杂度
时间复杂度:
添加时间复杂度, 示例: $O(n)$
空间复杂度:
添加空间复杂度, 示例: $O(n)$
Code
class Solution {
/**
* 1. 将字符串转为数组arr
*/
public String makeSmallestPalindrome(String s) {
if (s == null || s.isBlank()) {
return s;
}
int len = s.length();
int right = 0;
int left = len - 1;
char[] result = s.toCharArray();
while (right < left) {
if (result[right] < result[left]) {
result[left] = result[right];
} else {
result[right] = result[left];
}
right++;
left--;
}
return String.valueOf(result);
}
/**
* 2. 新建一个数组arr其长度和字符串一致
*/
public String makeSmallestPalindrome(String s) {
if (s == null || s.isBlank()) {
return s;
}
int len = s.length();
int right = 0;
int left = len - 1;
char[] result = new char[len];
while (right < left) {
if (s.charAt(right) == s.charAt(left)) {
result[right] = result[left] = s.charAt(right);
} else if (s.charAt(right) < s.charAt(left)) {
result[right] = result[left] = s.charAt(right);
} else {
result[right] = result[left] = s.charAt(left);
}
right++;
left--;
}
if (right == left) {
result[right] = s.charAt(right);
}
return String.valueOf(result);
}
}

浙公网安备 33010602011771号