题
思
其实我觉得我这代码效率应该是可以的,只遍历了一遍p;
但是跑出来结果并不好看,很奇怪;
思路就是两个指针start和end,end-start+1就是当前字符串的长度,每次只保存最长的字符串也就是个数。
最后把以每个字母开头的最长有效字符串的长度加起来就是结果。
个人还是比较满意今天的代码的。
代码
class Solution {
public int findSubstringInWraproundString(String p) {
Map<Character, Integer> count = new HashMap<Character, Integer>();
int start = 0, end = 0;
while (end < p.length()) {
while (end < p.length() - 1 && valid(p.charAt(end), p.charAt(end + 1))) {
end++;
}
while (start <= end) {
char l = p.charAt(start);
if (count.getOrDefault(l, 0) < end - start + 1) {
count.put(l, end - start + 1);
}
start++;
}
end++;
}
int res = 0;
for (Character c : count.keySet()) {
res += count.get(c);
}
return res;
}
private boolean valid(char a, char b) {
if (a == b - 1 || (a == 'z' && b == 'a')) {
return true;
}
return false;
}
}