我在面试中被问到以下问题。我不知道如何回答这个问题。请指导我。
问题:如何判断一个字符串是否可以分割成两个字符串 - 比如breadbanana可以分割成bread和banana,而breadbanan则不能。你将获得包含所有有效单词的字典。
问题:如何判断一个字符串是否可以分割成两个字符串 - 比如breadbanana可以分割成bread和banana,而breadbanan则不能。你将获得包含所有有效单词的字典。
T = trie of words in the dictionary
for every word in T, which can be found going down the tree by choosing the next letter of the input string each time we move to the child:
p <- length(word)
if T contains input_string[p:length(intput_string)]:
return true
return false
O(n)
的搜索,不是吗? - NPE您需要遍历您的词典,并将每个术语作为子字符串与原始术语进行比较,例如“breadbanana”。如果第一个术语与第一个子字符串匹配,则从原始搜索术语中切掉第一个术语,并将剩余的原始术语与下一个字典条目进行比较...
让我尝试用Java解释一下:
String dictTerm = "bread";
String original = "breadbanana";
// first part matches
if (dictTerm.equals(original.substring(0, dictTerm.length()))) {
// first part matches, get the rest
String lastPart = original.substring(dictTerm.length());
String nextDictTerm = "banana";
if (nextDictTerm.equals(lastPart)) {
System.out.println("String " + original +
" contains the dictionary terms " +
dictTerm + " and " + lastPart);
}
}
contains
和substring
函数来删除与字典匹配的单词。如果最终字符串为空 -> 字符串可以被分段,否则不能。您还可以注意计数。public boolean canBeSegmented(String s) {
for (String word : dictionary.getWords()) {
if (s.contains(word) {
String sub = s.subString(0, s.indexOf(word));
s = sub + s.subString(s.indexOf(word)+word.length(), s.length()-1);
}
return s.equals("");
}
}
这段代码检查您提供的字符串是否可以被完全分段。它会检查字典中的单词是否在您的字符串中,然后进行减法操作。如果您想在此过程中进行分段,必须按照单词内部的顺序对减去的片段进行排序。
只需要两个单词就可以简化操作:
public boolean canBeSegmented(String s) {
boolean wordDetected = false;
for (String word : dictionary.getWords()) {
if (s.contains(word) {
String sub = s.subString(0, s.indexOf(word));
s = sub + s.subString(s.indexOf(word)+word.length(), s.length()-1);
if(!wordDetected)
wordDetected = true;
else
return s.equals("");
}
return false;
}
}
这段代码检查一个单词,如果字符串中还有另一个单词且仅有这两个单词,则返回 true,否则返回 false。
这只是一个简单的想法,如果你愿意,你可以更好地实现它。
package farzi;
import java.util.ArrayList;
public class StringPossibility {
public static void main(String[] args) {
String str = "breadbanana";
ArrayList<String> dict = new ArrayList<String>();
dict.add("bread");
dict.add("banana");
for(int i=0;i<str.length();i++)
{
String word1 = str.substring(0,i);
String word2 = str.substring(i,str.length());
System.out.println(word1+"===>>>"+word2);
if(dict.contains(word1))
{
System.out.println("word 1 found : "+word1+" at index "+i);
}
if(dict.contains(word2))
{
System.out.println("word 2 found : "+ word2+" at index "+i);
}
}
}
}