无重复字符的最长子串
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
解析
我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界,其中左指针代表着枚举子串的起始位置,而右指针即为中的终止位置。
在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置,然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;
在枚举结束后,我们找到的最长的子串的长度即为答案。
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set=new HashSet<Character>();//去重
int right=-1;
int ans=0;
for(int left=0;left<s.length();++left){
if(left!=0){
set.remove(s.charAt(left-1));
}
while(right+1<s.length()&&!set.contains(s.charAt(right+1))){
set.add(s.charAt(right+1));
++right;
}
ans=Math.max(ans,right-left+1);
}
return ans;
}
}
找到字符串中所有字母异位词
给定两个字符串 s
和 p
,找到 s
中所有 p
的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。
异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。
解析
根据题目要求,我们需要在字符串 s 寻找字符串 p 的异位词。因为字符串 p 的异位词的长度一定与字符串 p 的长度相同,所以我们可以在字符串 s 中构造一个长度为与字符串 p 的长度相同的滑动窗口,并在滑动中维护窗口中每种字母的数量;当窗口中每种字母的数量与字符串 p 中每种字母的数量相同时,则说明当前窗口为字符串 p 的异位词
class Solution {
public List<Integer> findAnagrams(String s, String p) {
int sLen = s.length(), pLen = p.length();
if (sLen < pLen) {
return new ArrayList<Integer>();
}
int[] sChar = new int[26];// 存储sLen中每个字符的数量
int[] pChar = new int[26];
for (int j = 0; j < pLen; j++) {
sChar[s.charAt(j) - 'a']++;
pChar[p.charAt(j) - 'a']++;
}
List<Integer> ans = new ArrayList<Integer>();
if (Arrays.equals(sChar, pChar)) {
ans.add(0);
}
for (int i = 0; i < sLen - pLen; ++i) {
--sChar[s.charAt(i) - 'a'];
++sChar[s.charAt(i + pLen) - 'a'];
if (Arrays.equals(sChar, pChar)) {
ans.add(i + 1);
}
}
return ans;
}
}