zoukankan      html  css  js  c++  java
  • leetcode-567 字符串排列

    leetcode-567 字符串的排列

    题目描述:

    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。
    换句话说,第一个字符串的排列之一是第二个字符串的子串。
    示例1:

    输入: s1 = "ab" s2 = "eidbaooo"
    输出: True
    解释:
    s2 包含 s1 的排列之一 ("ba").
     
    示例2:
    输入: s1= "ab" s2 = "eidboaoo"
    输出:
    False
     
    注意:

    1. 输入的字符串只包含小写字母
    2. 两个字符串的长度都在 [1, 10,000] 之间

    ### 解法一: sliding window(滑动窗口)法来做

    每次s2中截取和s1等长的字符串,与s1进行比较,利用数组来统计a-z的数量,辅助比较

    java实现如下:

    class Solution {
        public boolean checkInclusion(String s1, String s2) {
            //s1 小字符串   s2 大字符串  s1 >= s2
            if(s1.length() > s2.length())   return false;
            
            int[] count = new int[26];
            for(int i = 0; i < s1.length();i++){
                //charat (i)返回字符串s1的第i个字符。假设此字符串只包含小写字母(即将字符“a”映射到索引0,
                //将字符“b”映射到索引1,以此类推(将“z”映射到索引25)。
                count[s1.charAt(i) - 'a'] ++; 
                count[s2.charAt(i) - 'a'] --;
            }
            
            if(helper(count)){
                return true;
            }
            
            for(int i = s1.length(); i < s2.length(); i++){
                count[s2.charAt(i) - 'a'] --;
                count[s2.charAt(i - s1.length()) - 'a'] ++;
                if(helper(count)){
                    return true;
                }
            }
            return false;
        }
        
        
        //数组为空返回true
        public boolean helper(int[] count){
            for(int num: count){
                if(num != 0){
                    return false;
                }
            }
            return true;
        }
    }
    

    c++实现如下:

    class Solution {
    public:
        bool checkInclusion(string s1, string s2) {
            int n1 = s1.size(), n2 = s2.size(),left = 0;
            vector<int> m(128);
            for(char c: s1) ++m[c];
            for(int right = 0; right < n2; ++right){
                if(--m[s2[right]] < 0){
                    while(++m[s2[left++]] != 0){}
                }else if(right - left + 1 == n1)    return true;
            }
            return n1 == 0;
        }
    };
    
  • 相关阅读:
    CentOS 7 上安装vim(默认未安装)
    SecureCRT8.3+SecureCRT_keygen完成注册
    vi/vim编辑器使用方法详解
    linux系统中如何进入退出vim编辑器,方法及区别
    centos7配置IP地址
    Linux入门基础教程
    【PHP 基础类库】Prototype 原型版教学文章!
    【PHP 模板引擎】Prototype 原型版发布!
    【JavaScript 封装库】BETA 5.0 测试版发布!
    【JavaScript 封装库】Prototype 原型版发布!
  • 原文地址:https://www.cnblogs.com/fightingcode/p/10804468.html
Copyright © 2011-2022 走看看