주제 시리즈: Substring with Concatenation of All Words
6158 단어 substring
public class Solution {
public ArrayList<Integer> findSubstring(String S, String[] L) {
//http://www.cnblogs.com/springfor/p/3872516.html
ArrayList<Integer> res = new ArrayList<Integer>();
if(S==null || L==null || S.length()==0 || L.length==0 ||L[0].length()==0) return res;
HashMap<String, Integer> dict = new HashMap<String, Integer>();
int wl = L[0].length();
for(String i: L){
if(dict.containsKey(i)){
dict.put(i, dict.get(i)+1);
}else
dict.put(i, 1);
}
for(int i=0; i<wl; i++){
int ind = i; // window's starting index
int cnt = 0; // check how many words included in the window, and it should not be more than L's length
HashMap<String, Integer> curdic = new HashMap<String, Integer>();
// for(int j = 0; j<S.length()-wl; j+=wl){ // check all words in S
for(int j = i; j<=S.length()-wl; j+=wl){
String curwd = S.substring(j, j+wl);
if(!dict.containsKey(curwd)){ // means there is no such word in L, clear curdic and move on(Concatenation must be continuous),
curdic.clear();
cnt=0;
ind = j+wl;
}else{
if(!curdic.containsKey(curwd)){
curdic.put(curwd, 1);
}else{
curdic.put(curwd,curdic.get(curwd)+1);
}
// is the window curdic overflow? now check cnt
if(curdic.get(curwd)<=dict.get(curwd)){
cnt++;
}else{
while(curdic.get(curwd)>dict.get(curwd)){ // slide the window and remove the words(tmp) till curwd
String tmp = S.substring(ind, ind+wl);
curdic.put(tmp, curdic.get(tmp)-1);
ind += wl;
if(curdic.get(tmp)<dict.get(tmp))
cnt--;
}
}
// is cnt already == L? which means the window has all L's words
if(cnt==L.length){
res.add(ind);
String tmp = S.substring(ind, ind+wl);
curdic.put(tmp, curdic.get(tmp)-1);
ind += wl;
cnt--; // cnt , i ,window curdic ,cnt
}
}
}
}
return res;
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
가장 많이 나타나는 오류 - 1주차예를 들면 다음 코드를 실행하면 바로 이 오류가 뜬다. 오류 발생 이유: iterable 객체 자리에 정수형 자료(int)를 입력했기 때문. C++처럼 10을 넣으면 10번을 반복해준다는게 아니다. iterable ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.