作者:disappearedgod
时间:2014-8-25
题目
Longest Substring Without Repeating Characters
Total Accepted: 20666 Total Submissions: 92944 My SubmissionsGiven a string, find the length of the longest substring without repeating characters. For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3. For "bbbbb" the longest substring is "b", with the length of 1.
想法
举一个例子“abcabcabcd”
第一种方法 Trie树法
将String的后缀序列输入Trie树。
public class Solution {
private TrieST trie;
public int lengthOfLongestSubstring(String s) {
int res = 0;
int tmp = 0;
HashSet<Integer> set = new HashSet<Integer>();
if(s.length() == 0)
return 0;
trie = new TrieST();
for(int i = 0; i < s.length(); i++){
trie.put(s.substring(i));
tmp = set.get(trie.get(s.substring(i)));
res = res > tmp ? res : tmp;
}
return res;
}
public class TrieST{
private Node root;
private int R = 256;
private class Node{
private int val;
private Node[] next = new Node[R];
}
public int get(String key){
Node x = get(root, key, 0);
if(x == null)
return null;
return x.val;
}
private int get(Node x, String key, int d){
if(x == null) return null;
if(d == key.length()) return x;
char c = key.charAt(d);
return get(x.next[c], key, d+1);
}
public void put(String key, int val){
root = put(root, key, val, 0);
}
private Node put(Node x, String key, int val, int d){
if(x == null) return null;
if(d == key.length()){
x.val = val;
return x;
}
char c = key.charAt(d);
x.next[c] = put(x.next[c], key, val, d+1);
}
}
}
暴力法后缀数组
想用一下JAVAAPI解决一下后缀数组题,用list和Collection排序。
public class Solution {
public int lengthOfLongestSubstring(String s) {
ArrayList<String> a = new ArrayList<String>();
for(int i = 0; i < s.length(); i++)
a.add(s.substring(i));
Collections.sort(a);
int max = 0;
String ret = "";
for(int i = 1; i < s.length(); i++){
if(max < a.get(i).compareTo(a.get(i-1))){
max =a.get(i).compareTo(a.get(i-1));
ret = a.get(i-1);
}
}
return max;
}
}
结果
结果