LeetCode--单词拆分

题目:

  给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判定s是否可以被空格拆分为一个或多个在字典中出现的单词;

  注:

    1、拆分时可以重复使用字典中的单词;

    2、可以假设字典中没有重复的单词;

  

  我的想法是使用回溯法,逐个查找s中可以在字典wordDict中匹配的单词

 1 import java.util.*;
 2 
 3 public class Solution {
 4     private List<String> wordDict;
 5     
 6     public boolean wordBreak(String s, List<String> wordDict) {
 7         this.wordDict = wordDict;
 8         return find(s, 0);
 9     }
10     
11     public boolean find(String s, int i)
12     {
13         if(i == s.length())
14         {
15             return true;
16         }
17         
18         for(int j = i; j < s.length(); j++)  // 步骤2,如果步骤1中的后续匹配失败,则回退并将指针j后移,查找字典中是否包含其它子串
19         {
20             if(wordDict.contains(s.substring(i, j+1)))  
21             {
22                 if(find(s, j+1))     //步骤1,查找到在字典中的单词时,就继续进行后续匹配
23                 {
24                     return true;
25                 }
26             }
27         }
28         return false;
29     }
30 }

  上述算法的时间复杂度,在最好的情况下时间复杂度为O(n),即只需遍历一次字符串,但在最坏的情况下时间复杂度为O(n^2),即每前进一个单词,都需要重新遍历一次字符串。在leetcode的36个测试用例里通过了29个测试用例,提示说在某些测试用例上超时,如:s="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab",wordDict=["a","aa","aaa","aaaa","aaaaa","aaaaaa","aaaaaaa","aaaaaaaa","aaaaaaaaa","aaaaaaaaaa"],在这个测试用例上,上述算法会存在大量的重复比较开销,有什么方法能避免重复比较呢?

猜你喜欢

转载自www.cnblogs.com/latup/p/11730181.html