解题思路
这道题和最长子序列有相似之处,可以理解为先把最长子序列找出来,在找的过程中就可以利用替换来增加子序列的长度,也可以理解为在还有替换次数的情况下可以忽视遇到的不相同的元素。
以上是大概思路。
首先是找升级版的最长子序列,因为可以替换。逐个遍历下去判断即可,这是最简单的方法了,暴力解决。
找完之后,如果还有替换次数没用完,那就继续换,length++。最后得到结果
最后我的时间是1304ms,击败5%的人哈哈哈哈哈哈哈。
class Solution {
public:
int characterReplacement(string s, int k){
char temp; //记录当前元素
int length = 0;//记录当前匹配串的长度
int maxL = 1;//记录最大长度
int sLength = s.length(); //s长度
if(s.length() == 0)
return 0;
int recordK = k;//记录替换次数
int pos;//记录下标位置
for(int i = 0; i < s.length(); i++){
recordK = k;//更新替换次数
pos = i + 1;//开始比较的元素是当前元素的下一个
temp = s[i];//记录当前元素
length = 1;//更新序列长度
while(pos < sLength && recordK >= 0){ //当s未匹配完或替换次数未用完
if(temp == s[pos]){ //与这一次序列的元素相同时
//cout << "temp=" << endl;
length++; //直接加长度
pos++;
}else{
if(recordK == 0)
break;
recordK--;
length++;
pos++;
}
}
while(recordK > 0 && length < s.length()){//如果替换次数没用完则继续换且字符串还有未替换的字符
length++;
recordK--;
}
if(length > maxL)
maxL = length;
}
return maxL;
}
};