高级农民
- 积分
- 1799
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2016-4-7
- 最后登录
- 1970-1-1
|
同timeout,应该有更快的解法
import java.util.*;
public class Solution {
HashMap<Character ,Integer> map = null;
public List<String> findSubstrings(String input) {
List<String> tmp = new ArrayList<>();
List<String> res = new ArrayList<>();
HashSet<Character> set = new HashSet<>();
HashMap<Character ,Integer> map = new HashMap<>();
for(int i=0;i<input.length();i++){
map.put(input.charAt(i),i);
}
this.map = map;
DFS(input,tmp,res,0,set);
return res;
}
private void DFS(String s, List<String> tmp,List<String> res, int index,HashSet<Character> set){
if(s.length()-index+tmp.size()<res.size()){
return;
}
if(index==s.length()){
if(res.size()<tmp.size()){
res.clear();
res.addAll(tmp);
}else if(res.size()==tmp.size()){
if(getLen(res)>getLen(tmp)){
res.clear();
res.addAll(tmp);
}
}
return;
}
if(set.contains(s.charAt(index))){
DFS(s,tmp,res,index+1,set);
return;
}
Character x = s.charAt(index);
int y = findNext(x,s,index,set);
if(y!=-1){
String tmpp = s.substring(index,y+1);
tmp.add(s.substring(index,y+1));
DFS(s,tmp,res,y+1,set);
tmp.remove(tmp.size()-1);
}
set.add(x);
DFS(s,tmp,res,index+1,set);
set.remove(x);
}
int findNext(Character x,String s,int i,HashSet<Character> set){
int res = i;
int xx = map.get(x);
while(res<s.length()&&res<xx){
if(set.contains(s.charAt(res))){
res = -1;
break;
}
xx = Math.max(xx, map.get(s.charAt(res)));
res ++;
}
return res;
}
int getLen(List<String> res){
int x = 0;
for(int i=0;i<res.size();i++){
x += res.get(i).length();
}
return x;
}
} |
|