天天看點

字元串的排列

此部落格連結:

字元串的排列

題目連結:https://leetcode-cn.com/problems/permutation-in-string/

題目

給定兩個字元串 s1 和 s2,寫一個函數來判斷 s2 是否包含 s1 的排列。

換句話說,第一個字元串的排列之一是第二個字元串的 子串 。

示例 1:

輸入: s1 = "ab" s2 = "eidbaooo"

輸出: True

解釋: s2 包含 s1 的排列之一 ("ba").

示例 2:

輸入: s1= "ab" s2 = "eidboaoo"

輸出: False

提示:

1 <= s1.length, s2.length <= 104

s1 和 s2 僅包含小寫字母

題解

每次在長的字元串中取和短字元串長度相等的字元串,從左向右周遊,周遊時,判斷長字元串的子串是否和短字元串有相同的字母。判斷字母是否相等時,我是使用兩個數組,數組長度分别為26,即26個字母的大小,然後用比較的字元串中的字母減去a得到數字作為數組的下标,并且指派為1,最後判斷兩個數組中1的個數是否相等,如果相等則判斷s1和s2有相同的字母。

代碼

class Solution {
    public boolean checkInclusion(String s1, String s2) {
    int len1=s1.length();
    int len2=s2.length();
    if(len1>len2)
    {
    return false;
    }
   int left=0;
   int right=len1-1;
   while(right<len2){
   if(Equal(s1,s2.substring(left,right))){
   return true;
   left++;
   right++;
   }
   }
    return false;
    }
   public boolean Equal(String s1,String s2){
      int  c1[]=new int[26];
      int c2[]=new int[26];
      for(int i=0;i<s1.length();i++){
      c1[s1.charAt(i)-'a']=1;
       c2[s2.charAt(i)-'a']=1;
      }
      for(int i=0;i<26;i++){
      if(c1[i]!=c2[i]){
      return false;
      }
      }
      return true;
   }
    
}      

結果

出來混總是要還的