剑指 Offer II 字符串


014. 字符串中的变位词

class Solution { 
     Map m1 =new HashMap<>();
        Map m2 =new HashMap<>();
    public boolean check(char c)
    {
        if(m1.containsKey(c)&&m1.get(c).equals(m2.get(c)))
            return true;
        return false;
    }
    public boolean checkInclusion(String s1, String s2) {
      
       for(char c : s1.toCharArray())
       {
           m1.put(c,m1.getOrDefault(c,0)+1);
       }
       //判断m1与m2有多少种字符是相等的 最多26
       for(int i=0,j=0,cnt=0;i

015. 字符串中的所有变位词

class Solution {
    Map mp=new HashMap<>();
     Map ms=new HashMap<>();
     boolean check(char c)
     {
         if(mp.containsKey(c)&&mp.get(c).equals(ms.get(c)))
         return true;
         return false;
     }
    public List findAnagrams(String s, String p) {
        List  ans =new ArrayList();
        
       char [] cs= s.toCharArray();
        char [] cp= p.toCharArray();
        for(char c : cp)
        {
            mp.put(c,mp.getOrDefault(c,0)+1);
          //  System.out.println(mp.size());
        }
        
        int n=s.length(),m=p.length();
        for(int i=0,j=0,cnt=0;im)
            {
                if(check(cs[j]))cnt--;
                ms.put(cs[j],ms.get(cs[j])-1);
                if(check(cs[j]))cnt++;
                j++;
            }
            //System.out.println(cnt);
            //System.out.println(mp.size());
            if(cnt==mp.size())ans.add(j);


        }
        return ans;

    }
}

016. 不含重复字符的最长子字符串

双指针
class Solution {
    public int lengthOfLongestSubstring(String s) {
        Map memo =new HashMap<>();
        int ans=0;
        char [] cs=s.toCharArray();
        for(int i=0,j=0;i

017. 含有所有字符的最短字符串

class Solution {
    Maphs=new HashMap<>();
     Mapht=new HashMap<>();
    public String minWindow(String s, String t) {
        char []cs= s.toCharArray();
         char []ct= t.toCharArray();
         
         String res="";
         //滑动窗口
         int cnt=0;
         for(char c: ct)ht.put(c,ht.getOrDefault(c,0)+1);
         for(int i=0,j=0;iht.getOrDefault(cs[j],0))
             {//当s[j]字符在hs中比ht多时  左指针应该滑动
                 hs.put(cs[j],hs.get(cs[j])-1);
                 j++;
             }
             if(cnt==t.length())
             {
                   if(res.isEmpty()||res.length()>i-j+1)res=s.substring(j,i+1);
             }
         }
         return res;
    }
}

018. 有效的回文

class Solution {
    public boolean isPalindrome(String s) {
        int n=s.length();
        char []cs=new char [n];
        int j=0;
        for(int i=0;i='a'&&c<='z'))cs[j++]=c;
            else if((c>='A'&&c<='Z'))cs[j++]=(char)(c+32);
            else if(c>='0'&&c<='9')cs[j++]=c;//数字
        }
        boolean flag=true;
        for(int i=0;i

019. 最多删除一个字符得到回文

找到两边第一处不同 跳过左边的 或右边的 再继续做 判断两次
class Solution {
    public boolean validPalindrome(String s) {
        int i=0,j=s.length()-1;
        while(i=j)return true;
        boolean flag=false;
        int I=i,J=j;
        i++;
         while(i=j)return true;

        i=I;j=J;
        j--;
            while(i=j)return true;
        return false;

    }
}

020. 回文子字符串的个数

class Solution {
    public int countSubstrings(String s) {
        //中心枚举 
        int n=s.length();
        int res=0;
        for(int i=0;i=0&&k=0&&k