题目要求:给定一个字符串,返回最长的回文子串, 比如"pwabbaqq",返回"abba"。
题目思路:用滑动窗口(左右指针)遍历这个字符串,并且在遍历的过程中用哈希表记录每个字符最后一次出现的索引,哈希表的基本单元(key,value) = (char, index) … 那么在遍历的过程中,如果遇到哈希表已经存在这个char,说明当前的字符串不是回文串,那么移动左指针到相应位置(同时左指针只能向右走)。
java当中遍历字符串的代码框架:
java的代码块很像
for(int i; i< str.length();i++ ){
// operation
}
哈希表的初始化和增删改查:
import java.util.HashMap
//定义
HashMap<Integer, String> hashmap= new HashMap<Integer, String>();
// 增
hashmap.put(1, "string1");
//查
hashmap.get(1);
//删
hashmap.remove(1);
// 改
hashmap.replace(key,value);
//哈希表中是否存在指定key
hashmap.containsKey(key);
//遍历哈希表
// foreach循环
for(var entry : map.entrySet()){
// 获得key
int key = entry.getKey();
// 获得value
int value = entry.getValue();
}
完整代码:
class Solution {
public int lengthOfLongestSubstring(String s) {
HashMap<Character, Integer> hashmap_char= new HashMap<Character, Integer>();
int max_len= 0;
int left_ptr= 0;
if (s.length() <1) return 0;
for (int index_r=0; index_r < s.length(); index_r++)
{
if (hashmap_char.containsKey(s.charAt(index_r))){
int temp_index = hashmap_char.get(s.charAt(index_r));
if (temp_index>=left_ptr)
{left_ptr = temp_index+1;}
hashmap_char.replace(s.charAt(index_r),index_r);
if (max_len <index_r- left_ptr+1)
{max_len=index_r- left_ptr+1;
}
}
else{
hashmap_char.put(s.charAt(index_r), index_r);
if (max_len <index_r- left_ptr+1)
{max_len=index_r- left_ptr+1;
}
}
}
return max_len;
}
}