如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串
text
,你只能交换其中两个字符一次或者什么都不做,然后得到一些单字符重复的子串。返回其中最长的子串的长度。示例 1:
输入:text = "ababa" 输出:3示例 2:
输入:text = "aaabaaa" 输出:6示例 3:
输入:text = "aaabbaaa" 输出:4示例 4:
输入:text = "aaaaa" 输出:5示例 5:
输入:text = "abcdef" 输出:1提示:
1 <= text.length <= 20000
text
仅由小写英文字母组成。
解法:每次将最多交换一个字符,则交换前的两个字符串之间最多隔着一个字符;
增加一个矩阵:行数为小写字母的个数26,列数为5,第0列表示相隔一个字符串的两个字符串的长度总和的最大值,第1列为中间字符左侧字符串的长度,第2列为右侧长度,第3列记录了连续字符串的个数,第4列为标记第0列中字符串是由一个连续串的长度还是两个相隔一个字符的连续字符串长度之和。
import java.util.Arrays;
class Solution {
public int maxRepOpt1(String text) {
int[][] mat = new int[26][5];
//
int temp1 = text.charAt(0) - 97;
mat[temp1][2]++;
mat[temp1][3]++;
int temp2 = -1;
for (int i = 1; i < text.length(); i++) {
char c1 = text.charAt(i);
int cInt1 = c1 - 97;
char c2 = text.charAt(i-1);
int cInt2 = c2 - 97;
if (c1 == c2) {
mat[cInt1][2]++;
} else {
mat[cInt1][3]++;
mat[cInt1][2]++;
// mat[cInt2][0] = Math.max(mat[cInt2][0], mat[cInt2][1] + mat[cInt2][2]);
if(mat[cInt2][0]<mat[cInt2][1] + mat[cInt2][2]){
mat[cInt2][0] =mat[cInt2][1] + mat[cInt2][2];
if(mat[cInt2][1]!=0&&mat[cInt2][2]!=0){
mat[cInt2][4]=1;
}
}
mat[cInt2][1] = mat[cInt2][2];
mat[cInt2][2] = 0;
}
if (cInt1 != temp2&&temp2!=-1&&cInt2 != temp2){
mat[temp2][1] = 0;
mat[temp2][2] = 0;
}
temp2=cInt2;
// System.out.println(Arrays.deepToString(mat));
}
int max=0;
for (int i = 0; i < mat.length; i++) {
// mat[i][0]=Math.max(mat[i][0], mat[i][1] + mat[i][2]);
if(mat[i][0]<mat[i][1] + mat[i][2]){
mat[i][0] =mat[i][1] + mat[i][2];
if(mat[i][1]!=0&&mat[i][2]!=0){
mat[i][4]=1;
}
}
if(mat[i][3]>2||(mat[i][4]==0&&mat[i][3]>1)){
mat[i][0]++;
}
if(mat[i][0]>max){
max=mat[i][0];
}
}
// System.out.println(Arrays.deepToString(mat));
return max;
}
}