字符串的排列(字符串leetocde567)-------------------c++/java实现
题目表述
给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。
换句话说,s1 的排列之一是 s2 的 子串.
样例
输入:s1 = “ab” s2 = “eidbaooo”
输出:true
解释:s2 包含 s1 的排列之一 (“ba”).
条件
1 <= s1.length, s2.length <= 104
s1 和 s2 仅包含小写字母
思路
不是相同字符串,是1的串和2的子串的某一顺序相同
ac代码
c++:
class Solution {
public:
bool checkInclusion(string s1, string s2) {
int long1=s1.size(),long2=s2.size();
int ns1[26]={0},ns2[26]={0},unsame=0;
if(long1>long2)
return false;
for(int i=0;i<long1;i++)
{
ns1[s1[i]-'a']++;
ns2[s2[i]-'a']++;
}
for(int i=0;i<26;i++)
if(ns1[i]!=ns2[i])
unsame++;
if(!unsame)
return 1;
for(int i=long1;i<long2;i++){
if(s2[i]==s2[i-long1])
continue;
else{
ns2[s2[i]-'a']++;
ns2[s2[i-long1]-'a']--;
if(ns2[s2[i]-'a']==ns1[s2[i]-'a'])
unsame--;
else if(ns2[s2[i]-'a']-1==ns1[s2[i]-'a'])
unsame++;
if(ns2[s2[i-long1]-'a']==ns1[s2[i-long1]-'a'])
unsame--;
else if(ns2[s2[i-long1]-'a']+1==ns1[s2[i-long1]-'a'])
unsame++;
}
if(!unsame)
return 1;
}
// cout<<unsame<<endl;
return 0;
}
};
java:
class Solution {
Boolean checkInclusion(String s1, String s2) {
int long1=s1.length(),long2=s2.length();
if(long1>long2)
return false;
int unsame=0;
int first1,end1,first2,end2;
int[] ns1=new int[26];
int[] ns2=new int[26];
for(int i=0;i<long1;i++)
{
ns1[s1.charAt(i)-'a']++;
ns2[s2.charAt(i)-'a']++;
}
for(int i=0;i<26;i++)
if(ns1[i]!=ns2[i])
unsame++;
if(unsame==0)
return true;
for(int i=long1;i<long2;i++){
if(s2.charAt(i)==s2.charAt(i-long1))
continue;
else{
ns2[s2.charAt(i)-'a']++;
ns2[s2.charAt(i-long1)-'a']--;
first1=ns2[s2.charAt(i)-'a'];
end1=ns2[s2.charAt(i-long1)-'a'];
first2=ns1[s2.charAt(i)-'a'];
end2=ns1[s2.charAt(i-long1)-'a'];
if(first1==first2)
unsame--;
else if(first1-1==first2)
unsame++;
if(end1==end2)
unsame--;
else if(end1+1==end2)
unsame++;
}
if(unsame==0)
return true;
}
// cout<<unsame<<endl;
return false;
}
};
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squares-of-a-sorted-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。