public class Solution {</span>
public boolean isSubsequence(String s, String t) {
int sIndex = 0;
int tIndex = 0;
while(sIndex<s.length() && tIndex<t.length()){
if(s.charAt(sIndex) == t.charAt(tIndex)){
sIndex++;
tIndex++;
} else{
tIndex++;
}
}
if(sIndex == s.length()){
return true;
}
return false;
}
}
Followup: Use a map to store the t once, then every time there is a s come in, check with the map rather than t.
public class Solution {
Map<Character, List<Integer>> map;
public boolean isSubsequence(String s, String t) {
// convet t to a map <character, index>
if(map == null){
map = new HashMap<Character, List<Integer>>();
for(int i=0; i<t.length(); i++){
if(!map.containsKey(t.charAt(i))){
map.put(t.charAt(i), new ArrayList<Integer>());
}
List<Integer> index = map.get(t.charAt(i));
index.add(i);
}
}
Map<Character, List<Integer>> curMap = new HashMap<Character, List<Integer>>(map);
// verify if s is subsequence of t
int sIndex = 0;
int tIndex = 0;
while(sIndex<s.length()){
if(!curMap.containsKey(s.charAt(sIndex))){
return false;
} else{
List<Integer> indexList = curMap.get(s.charAt(sIndex));
boolean isFound = false;
for(int i=0; i<indexList.size(); i++){
int index = indexList.get(i);
if(index>=tIndex){
tIndex = index;
isFound = true;
indexList.remove(i);
break;
}
}
if(isFound){
sIndex++;
} else{
return false;
}
}
}
return true;
}
}