考察知识点:字符串操作,枚举,二分
首先,我们不难发现朴素算法:
- 枚举答案串长度
- 检验所有长度为该长度的串变为26个字母需要的操作数量
- 然后回答即可
事实上,该算法在某些处理速度较快的语言中可以通过,时间复杂度为。
然而,将枚举改为二分,时间复杂度即可降为,可以轻松通过本题。
参考代码:
class Solution {
public:
int k;
string s;
inline bool check(int len)
{
for (int j = 1; j <= 26; ++j) {
int ret = 0;
for (int i = 0; i < len; ++i) {
ret += abs(s[i] - ('a' + j - 1));
}
if (ret <= k) return true;
for (int i = len; i < s.length(); ++i) {
ret += abs(s[i] - ('a' + j - 1));
ret -= abs(s[i - len] - ('a' + j - 1));
if (ret <= k) return true;
}
}
return false;
}
int string1(int K, string S) {
k = K, s = S;
int l = 1, r = s.length(), mid, ans = 0;
while (l <= r) {
mid = (l + r) >> 1;
if (check(mid) == true) l = mid + 1, ans = mid;
else r = mid - 1;
}
return ans;
}
}; 
京公网安备 11010502036488号