题目
思路
滑动窗口+hashmap,hashmap用来存储每个字符出现的下标,用来更新left指针。一直在
left = Math.max(map.get(s.charAt(right)) + 1, left)这里卡了很久,不知道为啥要取最大,以为直接将left= map.get(s.charAt(right))+ 1就行了。后面debug发现,字符串为“abba”时,遇到最后一个a,map.get(s.charAt(right))=0,left就会变为1,往后退了一步,所以需要取最大值。
代码
public int lengthOfLongestSubstring(String s) {
// 滑动窗口+哈希表(保存字符出现的最后一次下标)
int left = 0;
int right = 0;
HashMap<Character, Integer> map = new HashMap<>();
int maxSubLen = 0;
while(right < s.length()){
if(map.containsKey(s.charAt(right))){
// left = map.get(s.charAt(right)) + 1;
left = Math.max(map.get(s.charAt(right)) + 1, left);
}
// 更新下标
map.put(s.charAt(right), right);
// 更新长度
maxSubLen = Math.max(maxSubLen, right-left+1);
right++;
}
return maxSubLen;
}
题目
思路
将字符串与其逆序字符串进行比较,是否相等。 这个题目需要处理非数字字母情况,需要使用replaceAll的正则表达进行匹配。逆序是借助StringBuilder.reverse()进行的。
代码
public boolean isPalindrome(String s) {
// 正则匹配字母
String s1 = s.toLowerCase().replaceAll("[^a-zA-Z0-9]", "");
if(s1 == null){
return true;
}
// 逆序
String s2 = new StringBuilder(s1).reverse().toString();
if(s1.equals(s2)){
return true;
}
return false;
}
Tips
// 正则匹配数字字母
String s1 = s.toLowerCase().replaceAll("[^a-zA-Z0-9]", "");// 逆序
String s2 = new StringBuilder(s1).reverse().toString();