给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
package list2;
import list1.ListNode;
import java.util.*;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : list2
* @ClassName : TestOne.java
* @createTime : 2021/11/3 18:35
* @Email : 2467636181@qq.com
* 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
*
*/
public class TestOne {
public int lengthOfLongestSubstring(String s) {//太厉害了这个算法,但是还是没有下面的那个算法效率高,下面那个算法看不懂
int result = 0;//记录结果
Set<Character> set = new HashSet<>();//存放字符
for(int i = 0,j = 0;i<s.length();i++){//对字符串进行遍历
while(set.contains(s.charAt(i))){//当这个集合中含有这个字符的时候就执行下面的语句
set.remove(s.charAt(j++));//算法精华部分所在,提取出s字符串中在第一次出现重复字符串之前的所有字符都删掉
}
set.add(s.charAt(i));//set集合中添加该元素
result = Math.max(result,i-j+1);//结果他就等于上一次结果和这次集合的长度大的那个
}
return result;//返回结果
// // 记录字符上一次出现的位置//这个题解看不懂
// int[] last = new int[128];
// for(int i = 0; i < 128; i++) {
// last[i] = -1;
// }
// int n = s.length();
//
// int res = 0;
// int start = 0; // 窗口开始位置
// for(int i = 0; i < n; i++) {
// int index = s.charAt(i);
// start = Math.max(start, last[index] + 1);
// res = Math.max(res, i - start + 1);
// last[index] = i;
// }
//
// return res;
}
public static void main(String[] args) {
TestOne testOne = new TestOne();
String s = "abcabcbb";
int result = testOne.lengthOfLongestSubstring(s);
System.out.println(result);
}
}
s1 的排列之一是 s2 的 子串 。
package list2;
import jdk.swing.interop.SwingInterOpUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Queue;
/**
* Created with IntelliJ IDEA.
*
* @author : Future master
* @version : 1.0
* @Project : Java算法联系
* @Package : list2
* @ClassName : TestTwo.java
* @createTime : 2021/11/3 20:20
* @Email : 2467636181@qq.com
* 给你两个字符串s1和s2 ,写一个函数来判断 s2 是否包含 s1的排列。如果是,返回 true ;否则,返回 false 。
*
* 换句话说,s1 的排列之一是 s2 的 子串 。
*
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/permutation-in-string
*/
public class TestTwo {
public boolean checkInclusion(String s1, String s2) {//写了两个算法效率,都不咋地
if(s1.length()>s2.length()){//如果s1长度比s2大直接返回false
return false;
}
Map<Character,Integer> map1 = new HashMap<>();//新建一个s1 的map
Map<Character,Integer> map2 = new HashMap<>();//新建一个s2 的map
for(int i = 0;i<s1.length();i++){//将map1和map2进行初始化
if(map1.containsKey(s1.charAt(i))){
map1.put(s1.charAt(i),map1.get(s1.charAt(i))+1);
}else{
map1.put(s1.charAt(i),1);
}
if(map2.containsKey(s2.charAt(i))){
map2.put(s2.charAt(i),map2.get(s2.charAt(i))+1);
}else{
map2.put(s2.charAt(i),1);
}
}
if(map1.equals(map2))return true;//如果初始化的map就直接成立那么直接返回
for(int i = s1.length();i<s2.length();i++){//进行对窗口的移动
char tmp = s2.charAt(i-s1.length());//借助一个中间变量
if(map2.get(tmp)==1){//将map2中的第一个进去的进行去除
map2.remove(tmp);
}else{
map2.put(tmp,map2.get(tmp)-1);
}
if(map2.containsKey(s2.charAt(i))){//添加下一个元素
map2.put(s2.charAt(i),map2.get(s2.charAt(i))+1);
}else{
map2.put(s2.charAt(i),1);
}
if(map1.equals(map2))return true;
}
return false;
// char[] compare = s1.toCharArray();
// Arrays.sort(compare);
// String compareStr = new String(compare);
// System.out.println(compareStr);
// for(int i = 0;i<=s2.length()-s1.length();i++){
// String s3 = s2.substring(i,i+s1.length());
// char[] compare1 = s3.toCharArray();
// Arrays.sort(compare1);
// String compareStr1 = new String(compare1);
// System.out.println(compareStr1);
// if(compareStr.equals(compareStr1))return true;
// }
// return false;
}
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ccccbbbbaaaa";
TestTwo testTwo = new TestTwo();
System.out.println(testTwo.checkInclusion(s1,s2));
}
}