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
Given s = ccdaabcdbb
, substrs = ["ab", "cd"]
Return 2
Explanation:
ccdaabcdbb
-> ccdacdbb
-> cabb
-> cb
(length = 2)
直接使用BFS可以解决,但是一开始的时候使用python的返回值写错了位置,debug了很久
java
public class Solution {
/*
* @param s: a string
* @param dict: a set of n substrings
* @return: the minimum length
*/
public int minLength(String s1, Set<String> dict) {
// write your code here
if (s1 == null || dict == null) {
return -1;
}
Queue<String> queue = new LinkedList<>();
Set<String> set = new HashSet<>();
queue.offer(s1);
set.add(s1);
int min = Integer.MAX_VALUE;
while (!queue.isEmpty()) {
String str = queue.poll();
min = Math.min(min, str.length());
for (String s : dict) {
int index = str.indexOf(s);
while (index != -1) {
String new_str = str.substring(0, index) + str.substring(index + s.length(), str.length());
if (!set.contains(new_str)) {
queue.offer(new_str);
set.add(new_str);
}
index = str.indexOf(s, index + 1);
}
}
}
return min;
}
}
python
import Queue
class Solution:
"""
@param: s: a string
@param: dict: a set of n substrings
@return: the minimum length
"""
def minLength(self, s, dict):
# write your code here
if s is None or dict is None:
return -1
queue, table = Queue.Queue(), set()
queue.put(s)
table.add(s)
count = float('inf')
while not queue.empty():
string = queue.get()
count = min(count, len(string))
for ele in dict:
index = string.find(ele)
while index != -1:
new_str = string[: index] + string[index + len(ele): ]
if new_str not in table:
queue.put(new_str)
table.add(new_str)
index = string.find(ele, index + 1)
return count