题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
1.首先暴力一波:
import java.util.Scanner;
public class MainTest {
public static int lengthOfLongestSubstring(String s) {
char[] sChars = s.toCharArray();
int maxLength = 0;
int flag = 0;
int counter = 0;
int i = 0;
while (i < sChars.length){
counter = 1;
flag = 0;
for (int j = i + 1; j < sChars.length; j++){
for (int k = i; k < j; k++){
if (sChars[j] == sChars[k]){
flag = 1;
break;
}
}
if (flag == 1){
break;
}
counter += 1;
}
if (maxLength < counter){
maxLength = counter;
}
i += 1;
}
return maxLength;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
while (s.hasNext()) {
String string = s.next();
int maxLength = lengthOfLongestSubstring(string);
System.out.println(maxLength);
}
}
}
2.(摘自leetcode)滑动窗口是数组/字符串问题中常用的抽象概念。 窗口通常是在数组/字符串中由开始和结束索引定义的一系列元素的集合,即 [i, j)[i,j)(左闭,右开)。而滑动窗口是可以将两个边界向某一方向“滑动”的窗口。例如,我们将 [i, j)[i,j) 向右滑动 11 个元素,则它将变为 [i+1, j+1)(左闭,右开)。
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
public class MainTest {
public static int lengthOfLongestSubstring(String s) {
Set set = new HashSet();
int i = 0;
int j = 0;
int maxLength = 0;
while (i < s.length() && j < s.length()) {
boolean isInSet = set.contains(s.charAt(j));
if (!isInSet) {
set.add(s.charAt(j++));
maxLength = Math.max(maxLength, j - i);
}
else {
set.remove(s.charAt(i++));
}
}
return maxLength;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner s = new Scanner(System.in);
while (s.hasNext()) {
String string = s.next();
int maxLength = lengthOfLongestSubstring(string);
System.out.println(maxLength);
}
}
}