1.1 LeetCode之 无重复字符的最长子串(Longest Substring Without Repeating Characters)
题目:
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 "abcabcbb"
,没有重复字符的最长子串是 "abc"
,那么长度就是3。
给定 "bbbbb"
,最长的子串就是 "b"
,长度是1。
给定 "pwwkew"
,最长子串是 "wke"
,长度是3。请注意答案必须是一个子串,"pwke"
是 子序列 而不是子串。
1.2 我的解答
package com.leetcode;
import java.util.ArrayList;
public class LongestString {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(select_LongestString("assdasffcfergd"));
}
public static int select_LongestString(String s) {
int a=0;
ArrayList<String> arr=new ArrayList<>();
//获取一个字符串中所有的子字符串
for(int i=0;i<s.length();i++) {
for(int j=i+1;j<s.length();j++) {
arr.add(s.substring(i, j+1));
}
}
//获取子字符串中最长字符串的长度
for(int i=0;i<arr.size();i++) {
if(!compare(arr.get(i))) {
int b=arr.get(i).length();
if(b>a) {
a=b;
}
}
}
return a;
}
//判断字符串中是否存在重复的字符
public static boolean compare(String s) {
if (s==null||s.isEmpty()) {
return false;
}
char[] e=s.toCharArray();
for(char m:e) {
if(s.indexOf(m)!=s.lastIndexOf(m)) {
return true;
}
}
return false;
}
}
1.3滑动窗口法
/*
"滑动窗口"
比方说 abcabccc 当你右边扫描到abca的时候你得把第一个a删掉得到bca,
然后"窗口"继续向右滑动,每当加到一个新char的时候,左边检查有无重复的char,
然后如果没有重复的就正常添加,
有重复的话就左边扔掉一部分(从最左到重复char这段扔掉),在这个过程中记录最大窗口长度
*/
import java.util.HashMap;
public class Solution {
public int lengthOfLongestSubstring(String s) {
if(s == null || s.length() == 0) return 0;
//新建一个map进行存储char
HashMap<Character,Integer> map = new HashMap<Character,Integer>();
int leftBound = 0;
int max = 0;
for(int i=0; i<s.length();i++){
char c = s.charAt(i);
//窗口左边可能为下一个char,或者不变
leftBound = Math.max(leftBound,(map.containsKey(c))? map.get(c)+1:0);
max = Math.max(max, i-leftBound+1);//当前窗口长度
map.put(c,i);
}
return max;
}
}