如果字符串中的所有字符都相同,那么这个字符串是单字符重复的字符串。
给你一个字符串 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
仅由小写英文字母组成。
C++
class Solution {
public:
int maxRepOpt1(string text)
{
int n=text.length();
int res=1;
map<char,int> tmp;
for(int i=0;i<n;i++)
{
tmp[text[i]]++;
}
if(1==n)
{
return 1;
}
else if(2==n)
{
if(text[0]==text[1])
{
return 2;
}
else
{
return 1;
}
}
else
{
for(int i=1;i<n-1;i++)
{
int left=0;
int right=0;
int s=i-1;
int t=i+1;
while(s>=0 && text[s]==text[i-1])
{
left++;
s--;
}
while(t<n && text[t]==text[i+1])
{
right++;
t++;
}
if(text[i-1]==text[i+1])
{
if(text[i-1]==text[i])
{
int val=left+right+1;
if(val<tmp[text[i]])
{
val++;
}
res=max(res,val);
}
else
{
if(left+right<tmp[text[i-1]])
{
res=max(res,left+right+1);
}
else
{
res=max(res,left+right);
}
}
}
else
{
if(text[i-1]==text[i])
{
left++;
}
if(text[i+1]==text[i])
{
right++;
}
if(left<tmp[text[i-1]])
{
left++;
}
if(right<tmp[text[i+1]])
{
right++;
}
res=max(res,max(left,right));
}
}
return res;
}
}
};