Given a string
s and a set of n substrings. You are supposed to remove every instance of those n substrings from s so that s is of the minimum length and output this minimum length.Example
Example 1:
Input:
"ccdaabcdbb"
["ab","cd"]
Output:
2
Explanation:
ccdaabcdbb -> ccdacdbb -> cabb -> cb (length = 2)
Example 2:
Input:
"abcabd"
["ab","abcd"]
Output:
0
Explanation:
abcabd -> abcd -> "" (length = 0)
Solution: BFS
public class Solution {
/*
* @param s: a string
* @param dict: a set of n substrings
* @return: the minimum length
*/
public int minLength(String s, Set<String> dict) {
// write your code here
if (s == null || s.length() == 0) {
return 0;
}
if (dict == null || dict.size() == 0) {
return s.length();
}
// BFS
//
Queue<String> queue = new LinkedList<>();
Set<String> visited = new HashSet<>();
queue.offer(s);
visited.add(s);
int ans = s.length();
while (!queue.isEmpty()) {
String curStr = queue.poll();
for (String dictWord : dict) {
for (int i = 0; i < curStr.length(); i++) {
int startIdx = curStr.indexOf(dictWord, i);
if (startIdx != -1) {
String newStr = curStr.substring(0, startIdx) + curStr.substring(startIdx + dictWord.length());
if (newStr.length() < ans) {
ans = newStr.length();
}
if (!visited.contains(newStr)) {
queue.offer(newStr);
visited.add(newStr);
}
}
}
}
}
return ans;
}
}
No comments:
Post a Comment