无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
输入: s = ""
输出: 0
提示:
0 <= s.length <= 5 * 104s由英文字母、数字、符号和空格组成
刚看到题, 第一反应是这个...
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 <= 104s1和s2仅包含小写字母
网上一个大佬的做法:
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;
}
}