Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 解开绳子_Java_String_Algorithm - Fatal编程技术网

Java 解开绳子

Java 解开绳子,java,string,algorithm,Java,String,Algorithm,如何使用提供的单词列表解开字符串 例如: 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 O

如何使用提供的单词列表解开字符串

例如:

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

任何关于如何实现…?

的建议或想法这里是我解决算法的方法

1) 将字典中的数据加载到哈希映射结构中以进行氨化常量时间查找,或加载到有序映射中以进行对数时间查找

2) 遍历可能的子字符串[0,i],直到在字典中找到匹配项

a) 如果找到匹配项,则从输入字符串中删除该单词,并将其存储在ArrayList结构中以报告最终答案

b) 如果未找到匹配项或i等于字符串报告的大小,则为null

3) 迭代字符串数组列表并打印一个空格分隔的列表


根据查找时间(我们称之为L),此算法应采用O(n*L),其中n是输入字符串中的字符数。如果查找需要一个固定的时间,例如一个哈希映射,那么它将是O(n),否则您可以在O(n log D)中进行查找。其中D是字典的大小。

最大的挑战是如何分解输入字符串,所有答案/注释都将基于某种假设,直到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