如何使用提供的单词列表解开字符串。
例如:
List of words in Dictionary:
Hi
Hello
Welcome
to
Stack
Overflow
Input String:
WelcometoStackOverflow
Output must be (with space added):
Welcome to Stack Overflow
对于列表中没有的字词,应打印NULL
。
Input String:
StackOverflowWelcomeYou
Output must be:
NULL
任何建议或想法如何实施...... ??
答案 0 :(得分:1)
以下是我将采用的解决算法的方法。
1)在Dictionary中加载一个哈希映射结构,用于固定的常量时间查找,或者加载到一个有序的映射中,用于对数时间查找
2)迭代通过可能的子串[0,i]直到在字典中找到匹配
a)如果找到匹配项,请从输入字符串中删除此单词并存储在ArrayList结构中以报告最终答案
b)如果未找到匹配或i等于字符串报告的大小为空
3)迭代你的数组字符串列表并打印一个空格分隔列表
根据查询时间,我们称之为L,此算法应采用O(n * L),其中n是输入字符串中的字符数。如果查找采用固定的常量时间,例如哈希映射,那么它将是O(n),否则你可以在O(n log D)中进行。其中D是字典的大小。
答案 1 :(得分:1)
最大的挑战是如何分解输入字符串,所有答案/评论将基于一些假设,直到OP提供更多细节。
在这个答案中,假设输入是一个带首字母大写的驼峰字符串。
public class CheckDict {
static Set<String> dict = new HashSet<String>(Arrays.asList(new String[]
{"Hi", "Hello", "Welcome", "To", "Stack", "Overflow"}));
public static void main(String[] args) {
System.out.println("Test 1: " + findDict("WelcomeToStackOverflow"));
System.out.println("Test 2: " + findDict("StackOverflowWelcomeYou"));
}
static String findDict(String str) {
// split the string when we encounter an upper case letter except at start
String[] arr = str.split("(?<!^)(?=[A-Z])");
StringBuilder output = new StringBuilder(arr[0]);
for (int i=1; i< arr.length; i++) {
if (!dict.contains(arr[i]))
return null;
else
output.append(' ').append(arr[i]);
}
return output.toString();
}
}
<强>输出:强>
Test 1: Welcome To Stack Overflow
Test 2: null