《Cracking the Coding Interview》——第18章:难题——题目7

2014-04-29 03:05

题目:给定一个词典,其中某些词可能能够通过词典里其他的词拼接而成。找出这样的组合词里最长的一个。

解法:Leetcode上有Word Break这道题,和这题基本思路一致。

代码:

 1 // 18.7 Given a list of words, find out the longest word made of other words in the list.

 2 #include <iostream>

 3 #include <string>

 4 #include <unordered_set>

 5 #include <vector>

 6 using namespace std;

 7 

 8 class Solution {

 9 public:

10     string longestBreakableWord(unordered_set<string> &dict) {

11         unordered_set<string>::const_iterator usit;

12         string res = "";

13         

14         for (usit = dict.begin(); usit != dict.end(); ++usit) {

15             if (wordBreak(*usit, dict) && usit->length() > res.length()) {

16                 res = *usit;

17             }

18         }

19         

20         return res;

21     }

22 private:

23     bool wordBreak(string s, unordered_set<string> &dict) {

24         int n;

25         int i, j;

26         string str;

27         vector<int> dp;

28         

29         n = (int)s.length();

30         if (n == 0 || dict.empty()) {

31             return false;

32         }

33         dp.resize(n);

34         for (i = 0; i < n; ++i) {

35             str = s.substr(0, i + 1);

36             if (dict.find(str) != dict.end()) {

37                 dp[i] = 1;

38             } else {

39                 for (j = 0; j < i; ++j) {

40                     if (dp[j] && dict.find(s.substr(j + 1, i - j)) != dict.end()) {

41                         dp[i] = 1;

42                         break;

43                     }

44                 }

45                 if (j == i) {

46                     dp[i] = 0;

47                 }

48             }

49         }

50         

51         i = dp[n - 1];

52         dp.clear();

53         return i == 1;

54     }

55 };

56 

57 int main()

58 {

59     unordered_set<string> dict;

60     string s;

61     Solution sol;

62     int i, n;

63     

64     while (cin >> n && n > 0) {

65         for (i = 0; i < n; ++i) {

66             cin >> s;

67             dict.insert(s);

68         }

69         

70         cout << sol.longestBreakableWord(dict) << endl;

71     }

72     

73     return 0;

74 }

 

你可能感兴趣的:(interview)