字符串的排列(字符串leetocde567)-------------------c++/java实现

本文解析了如何使用C++和Java实现字符串s1的排列检查,判断s2中是否包含s1的排列,通过字符计数和动态更新计数器的方法,确保在不同长度字符串中查找子串。适合学习字符串操作和动态规划的编程练习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字符串的排列(字符串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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值