学习计划算法: 第六天

111 阅读1分钟

无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
输入: s = ""
输出: 0

提示:

  • 0 <= s.length <= 5 * 104
  • s 由英文字母、数字、符号和空格组成

leetcode-cn.com/problems/lo…

刚看到题, 第一反应是这个...

class Solution {
    public int lengthOfLongestSubstring(String s) {
        char[] arr = s.toCharArray();
        List<Character> idxList = new ArrayList();
        int max = 0;
        for(int i=0; i< arr.length; i++){
            int inx = idxList.indexOf(arr[i]);
            idxList.add(arr[i]);
            if(inx != -1){
                if(max < idxList.size()-1){
                    max = idxList.size()-1;
                }
                idxList = idxList.subList(inx+1, idxList.size());
            }
        }

        if(idxList.size() > 0 && max < idxList.size()){
            max = idxList.size();
        }
        return max;
    }
}

字符串的排列

给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。如果是,返回 true ;否则,返回 false 。

换句话说,s1 的排列之一是 s2 的 子串 。

示例:

输入: s1 = "ab" s2 = "eidbaooo"
输出: true
解释: s2 包含 s1 的排列之一 ("ba").
输入: s1= "ab" s2 = "eidboaoo"
输出: false

提示:

  • 1 <= s1.length, s2.length <= 104
  • s1 和 s2 仅包含小写字母

leetcode-cn.com/problems/pe…

网上一个大佬的做法:


class Solution {
    public boolean checkInclusion(String s1, String s2) {
        
        int len1 = s1.length();
        int len2 = s2.length();

        int[] c1 = new int[26];
        int[] c2 = new int[26];
        if(len1 == 1){
            return s2.contains(s1);
        }

        if(len1 > len2){
            return false;
        }

          for(int i=0;i<len1;i++){
            c1[s1.charAt(i)-'a']++;
            c2[s2.charAt(i)-'a']++;
        }
        if(Arrays.equals(c1,c2)){
            return true;
        }
        for(int j=len1;j<len2;j++){
            
            c2[s2.charAt(j)-'a']++;
            c2[s2.charAt(j-len1)-'a']--;
            if(Arrays.equals(c1,c2)){
                return true;
            }    
        }
        return false;
    }
}