字符串的排列
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串 。
示例 1:
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
示例 2:
输入:s1= “ab” s2 = “eidboaoo”
输出:false
class Solution {
public boolean checkInclusion(String s1, String s2) {
int m=s1.length(),n=s2.length();
if(m>n)
return false;
int[] arr=new int[26];
for(int i=0;i<m;i++)
{
-- arr[s1.charAt(i)-'a'];
}
int l=0;
for(int r=0;r<n;++r)
{
int x=s2.charAt(r)-'a';
arr[x]++;
while(arr[x]>0){
--arr[s2.charAt(l)-'a'];
++l;
}
if(r-l+1==m)return true;
}
return false;
}
}
个人总结: 滑动窗口思想不熟练。
无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: s = “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: s = “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> a=new HashSet<>();
int n=s.length();
int r=-1,ans=0;
for(int i=0;i<n;i++)
{
if(i!=0)
{
a.remove(s.charAt(i-1));
}
while(r+1<n&&!a.contains(s.charAt(r+1)))
{
a.add(s.charAt(r+1));
r++;
}
ans=Math.max(r-i+1,ans);
}
return ans;
}
}
个人总结: 不熟练。