给你一个仅由大写英文字母组成的字符串,你可以将任意位置上的字符替换成另外的字符,总共可最多替换 k 次。在执行上述操作后,找到包含重复字母的最长子串的长度。
注意:
字符串长度 和 k 不会超过 104。
示例 1:
输入:
s = "ABAB", k = 2
输出:
4
解释:
用两个'A'替换为两个'B',反之亦然。
示例 2:
输入:
s = "AABABBA", k = 1
输出:
4
解释:
将中间的一个'A'替换为'B',字符串变为 "AABBBBA"。
子串 "BBBB" 有最长重复字母, 答案为 4。
思路:双指针法
1.从左指针指向的位置开始遍历,每次将左指针指定的字符设定为一个标准,右指针向右遍历
2.1如果与标准相同,继续向下遍历
2.2如果不同,要是还有交换次数,那就换掉这个字符继续向后遍历
2.3如果没有交换次数且不相同,则退出本次遍历,左指针向后移一位
3.重复1操作
提交的代码:
class Solution {
public int characterReplacement(String s, int k) {
int i=0,j=0,sum=1,max=0,t=k;
if(s.length()>1)
{
if(s.charAt(0)!=s.charAt(1)&&t>0)
{
t--;
sum++;
}
for(j=2;j<s.length();j++)
{
if(s.charAt(j)!=s.charAt(1)&&t>0)
{
t--;
sum++;
}
else if(s.charAt(j)==s.charAt(1))
{
sum++;
}
else
{
break;
}
max = Math.max(max, sum);
}
}
for(i=0;i<s.length()-1;i++)
{
sum=1;
t=k;
for(j=i+1;j<s.length();j++)
{
if(s.charAt(j)!=s.charAt(i)&&t>0)
{
t--;
sum++;
}
else if(s.charAt(j)==s.charAt(i))
{
sum++;
}
else
{
break;
}
max = Math.max(max, sum);
}
}
return max;
}
}
完整的代码:
public class Solution424 {
public static int characterReplacement(String s, int k) {
int i=0,j=0,sum=1,max=0,t=k;
if(s.length()>1)
{
if(s.charAt(0)!=s.charAt(1)&&t>0)
{
t--;
sum++;
}
for(j=2;j<s.length();j++)
{
if(s.charAt(j)!=s.charAt(1)&&t>0)
{
t--;
sum++;
}
else if(s.charAt(j)==s.charAt(1))
{
sum++;
}
else
{
break;
}
max = Math.max(max, sum);
}
}
for(i=0;i<s.length()-1;i++)
{
sum=1;
t=k;
for(j=i+1;j<s.length();j++)
{
if(s.charAt(j)!=s.charAt(i)&&t>0)
{
t--;
sum++;
}
else if(s.charAt(j)==s.charAt(i))
{
sum++;
}
else
{
break;
}
max = Math.max(max, sum);
}
}
return max;
}
public static void main(String[] args)
{
//String s= "ABAB";
//int k=2;
//String s = "AABABBA";
//int k = 1;
//String s ="ABBB";
//int k =2;
System.out.println(characterReplacement(s,k));
}
}