注册一亩三分地论坛,查看更多干货!
您需要 登录 才可以下载或查看附件。没有帐号?注册账号
x
这道题有个很长的testcase (testcase附在下面 过不去,但是用leetcode run code 或者本地IDE跑都是能得到正确的结果的 (正确结果是 [] ) 。注意是不提交,只是点击leetcode的 "run code"按钮 也能得到这个结果。
实在是想不到哪里能有问题,唯一想到的是建trie的时候分配memory手动分配咋stack而不是heap上,这个方法当时在concatenate words的时候 看到discussion李提到过,但是我没看懂。。。(醉了)。。
我的思路就是分别建前缀树和后缀树。后缀树是每个单词的reverse。然后针对words中的每个单词,看这个单词是不是新组合单词的前缀(新组合单词的后缀就是从后缀树找到以但这个单词为前缀的所有单词), or 看这个单词是不是新组合的后缀。
各位大大怎么看~~  - #define CHILDSIZE 26
- class TrieNode{
- public:
- TrieNode * children[CHILDSIZE];
- bool isWord;
- TrieNode(): isWord(false){
- for (auto & child : children){
- child = nullptr;
- }
- }
- };
- class Trie{
- public:
- TrieNode * root;
- Trie(){
- root = new TrieNode();
- }
- ~Trie(){
- for (int i = 0; i < CHILDSIZE; ++i){
- delete this->root->children[i];
- }
- }
- void insert(string word) {
- TrieNode * curr = root;
- for (int i = 0; i < word.size(); ++i){
- //每次判断这个节点是否存在,如果不存在则创建一个
- if (!curr->children[word[i]-'a']){
- curr->children[word[i]-'a'] = new TrieNode();
- }
- curr = curr->children[word[i]-'a'];
- }
- curr->isWord = true; // 全部插完后加bool标记
- }
- bool startsWith(string prefix) {
- if (prefix.empty()){
- return false;
- }
- TrieNode * curr = root;
- for (int i = 0; i < prefix.size(); ++i){
- if (curr->children[prefix[i]-'a'] == nullptr){
- return false;
- }
- curr = curr->children[prefix[i]-'a'];
- }
- //prefix每个字符都遍历完了
- return true;
- }
- // 我们已经假设prefix是trie树的合法前缀
- void findSuffix(vector<string> & res, string prefix){
- TrieNode * curr = root;
- for (int i = 0; i < prefix.size(); i++){
- if (curr->children[prefix[i]-'a']){
- curr = curr->children[prefix[i]-'a'];
- }
- }
- string temp = "";
- for (int i = 0; i < CHILDSIZE; ++i){
- if (curr->children[i]){
- TrieNode * preserved = curr;
- curr = curr->children[i];
- temp += ('a' + i);
- if (curr->isWord){
- res.push_back(prefix + temp);
- }
- findSuffix(res, prefix+temp);
- temp.pop_back();
- curr = preserved;
- }
- }
- }
- };
- class Solution {
- public:
- vector<vector<int>> palindromePairs(vector<string>& words) {
- vector<vector<int>> res;
- unordered_map<string, int > wordsMap;
- if (words.empty()) return res;
- bool hasEmpty = false;
- // create trie
- Trie * prefixTrie = new Trie();
- for (int i = 0; i < words.size(); ++i){ // 正向的前缀树
- prefixTrie->insert(words[i]);
- wordsMap[words[i]]=i; // 构建前缀树的过程中 顺手把word:wordidx对应的map建好
- if (words[i] == ""){hasEmpty = true;} // 我们认为空字符串是任何单词的前缀 也是任何单词的后缀
- }
- Trie * suffixTrie = new Trie();
- for (string w : words){ // 反向的后缀树
- reverse(w.begin(), w.end());
- suffixTrie->insert(w);
- }
- // 查找
- for (int i = 0; i < words.size(); ++i){
- // 单词words[i]可能是新组合单词的前缀
- if (suffixTrie->startsWith(words[i])){ //如果在后缀树里
- // 找到所有对应的单词
- vector<string> alists;
- suffixTrie->findSuffix(alists, words[i]); // 在后缀树中找到以words[i]为前缀的所有单词
- alists.push_back(words[i]); // words[i]本身也可能是后缀树的组成部分
- for (string wr : alists){
- reverse(wr.begin(), wr.end());
- string wcomb = words[i] + wr; // words[i]是新组合单词的前缀
- if (wordsMap.count(wr) && isPalindrome(wcomb)){
- int idx2 = wordsMap[wr]; // 找对应的idx
- if (i != idx2){ //distince [i,j]
- res.push_back(vector<int>{i, idx2});
- }
- }
- }
- }
- // 单词words[i]可能是新组合单词的后缀
- string wr = words[i];
- reverse(wr.begin(), wr.end());
- if (prefixTrie->startsWith(wr)){ // 如果在前缀树里
- // 找到以reverse of words[i]为前缀的所有单词
- vector<string> alists;
- prefixTrie->findSuffix(alists, wr);
- alists.push_back(wr); // words[i]本身是前缀树的一部分
- for (string w : alists){
- string wcomb = w + words[i]; // 注意这里不需要wr再reverse了! words[i]是新组合单词的前缀
- if (wordsMap.count(w) && isPalindrome(wcomb)){
- int idx2 = wordsMap[w]; // 找对应的idx
- if (i != idx2){ //distince [i,j]
- res.push_back(vector<int>{idx2, i});
- }
- }
- }
- }
- }
- if (hasEmpty){
- int idx = wordsMap[""];
- for (int i = 0; i < words.size(); ++i){
- if (i != idx && isPalindrome(words[i])){
- res.push_back(vector<int>{i,idx}); // 空字符是任何单词(如果单词本身是回文串)的后缀
- res.push_back(vector<int>{idx, i}); // 空字符是任何单词(如果单词本身是回文串)的前缀
- }
- }
- }
- std::sort(res.begin(), res.end());
- res.erase(std::unique(res.begin(), res.end()), res.end());
- return res;
- }
- // 检查单词是不是palindrome
- bool isPalindrome(string &s){
- if (s.empty()){return true;}
- if (s.size() <= 1){ return true;}
- int left = 0, right = (int)(s.size()-1);
- while (left < right){
- if (s[left] == s[right]){
- left++; right--;
- }
- else{ return false; }
- }
- return true;
- }
- };
- int main(){
- vector<string> words = {"aba","ba","a","caba"};
- vector<vector<int> > pairs = Solution().palindromePairs(words);
- for (auto p: pairs){
- for (auto i : p){
- cout << i << " ";
- }
- cout << endl;
- }
- return 0;
- }
复制代码 最长的那个test case: {"bbaabaaaabbbbaaaabaaaabaabbabbbaaabbabbbabbaaababbaabbaaaabbbaabbaabaaaabaaabbaabab","babbbbbaabbbaaaaaabbbbbbbaabbabbabbbbbaababaabbabbbabbbbbbabba","bbbbaabbbababbabbbbabaababaabbaabbabaaaaabababbabbabbbbbabbbbaaaabbabbabbbabababbbaaa","ababbbbbbbaaaabbaaababbbabababbaabbaababbbabbbabaabbaabaababbbabababaaabbbbabbaa","abbbaababaaaaabababaabaaaaaabbbbbbbababaaaabaabbbaaabbaaaabbbabbbbabbaaaaaaaaaaabbaaaababbabbbabbabaaaaabbaababbabbabababaaaaabbabbababbaaaabbbababaaabbaaabbabbaaba","aabbaaaaaaabaaabbbababbbbabababaaabbbabaabbababbaabbbbbaabbbbaabaa","abbabaabbaaaaaababbbabbabababbababbbbaaaaabbbaaabbaababbababbbabbaaaabbabbbabbabaaaaaaabbabbbaababaaaabbaabaabababbaaaababbabbbabaabbabbbbaaaabbabbaabbaaaababbbbbbaaaaaababba","abbabaabbabbabbbabaabbbbbabaabbbbaabaaabaabaaabbaaaaaaababbababb","bbabbbbaaabbbbaaababbabaabbbbababaaaabbaaabbbaabbbaaabaababababaaaaabbbbaaaabbbababbabbbbaabbbbaaaaaaaaaabbabaaabaabaaa","aabaabbabbabbaaabbbbbaabbaababbabbaabbabaaaaaababaabaabbaaaabbabbbaababaaabaabbbbbaabbbbabbbbaaaaabbbbabbbbabaabaabbaabbbabaabababaabbaaaaabbabaaabbaabbbabaaaababbabbbababaaabbaa","bbbaaaaaaaabaababbabbabbbb","aabbaababbbbbbbabbbababaaaababbabaaabbaaaaabbbaaababbaaabbaaaaaaabbaabbaababbbbaabbaababbabbbbbbaaabaaaabbaabaababaabaab","aabbaabaabbabaabbbababbbaababbaaaababaaaaabaaaababbabbabababaaaabbabbbabbbbbbaababaaabbbababaabaaaabbbabaaa","aabbbbbbaabbabababbbbabbbbbaabbabaabbaaabbbb","ababbabaaabaaa","babbaaaaabbaaabaaaabaabaabaaabaaaaaaabaaabba","bababaabbaaaaababbabaaabbbabababbbbbabbbbababb","aaababbbbaabaabaaaabaabbabbababaaaaab","baabbbbbaabbaaaaababbabaabbabaaaabbabbbaabbabababababbaabaaabbbaabaabbbabbaaabbbbabababaabaabaabaabbbaaabaaabbbaaabaaaabbaaabbaaaababbbbabbaabbababbaabbbbbbababaaaabbbababa","baabbabaabaababbbaababbbbbabbbabbaaaaaaaabbbaabbaabaabbbabaabaabaabbaaabaaaabaaabaababaa","bbabbbabaababaabaaabbbbaaaaaabbbaaaaaaabababababbbbababbaaaaabbaabbabababbaaaabababbababbabbababbabbaa","aabbaabaabbaaabaaaaaabaaabbabababaaaabbabaabaaabbbabababbaabaaabbabbbbabbaabbababbbabbaaaabaaababbabbbbbbaaabbaababbabaabaaabaaabbbabaababaa","babaaababaabbabbabbbbbabaaabbaaabbabaabbabbabbbaabbbaaaaaabaabbaababbbbaaababbababbabbbabaababaabbabababbbabaabbbbaabaababbaa","bbabbababaaababababaabaaaaaaaabaababaababbabbabb","bbabbbbabbaaaabaabbbbbbabbbaaaaaaabbbbabbaaabbabaabbabaabbbbbbaabbbabaaabbabaaabbaba","baabbbbbbaaaaabbaabbbbabaaabbaaaabbbaaabbabaaababaababbbbbbabbaabaaabaaabbabbabaaaba","bbbaabaabbabababbaaabbaaaababaabbbbaabaaaaaaaaabbbbaabbbbabbbabababbabbbbababbaabbba","aabbbaabaababaaaabbbbabaabaabaaabababbaabbaabbaaabaababaaabbbabaaababaabbaababbbbaababaabaabbaababbababbbbbababababaabbabbaabaaaaaabaabbaabaabaaabaabba","abbabaababbbbbbaaaaaababbaabaabbaabbaaaababaababaabbbbbaaaabbbabbbbbaabbbbbbaaababbbaabaabababb","bbbaabaabaaaaabaabaabbbbaaaabaabbbbbaabbaaabbbbbababbbbabbaaaaabbaababababababbbbbbbaaabaabbbaaaaababbbaabbabaabababbbbaaabaabbababbbaabbaabbbbaaaabababbabaabbaaaaaababaaaaabaababaabbabaabbabababab","babaabaabaabbbabaaaabaabbbaaaaaaabaababbabbbaabbbabaababbabbaabbaaabaaaabaababbabbaababbabababbbabaabbbababbbbbbbaaababbaaaabaabaabbababbaaabbaabbbaaabaabaaaabaa","abbbababaaabbaabbbbabababbaabbaaaabaabaabbbbbbbbaabbbbaaaaabbbbabaaaaabbbaaaaabbbbaaaaaababbbbbaabbabaaaaabbaabaaabaababbabaabaaabbab","babaabaababababbbbabababbbaabbaaabbbaabbaaaabaaabbbbbaaaab","aaaabbaabababbbaa","bbbbabbaabaabbbbaaaaaaaabbaababaaabaaabaaabbbbaababbbaabaabbbbaaabbabaabbbbbabbbbaaabababaabbaaababbabababbbabbabaabaaaabbab","aababaabaaaaaabbabababaaaaababbbbaabaa","bbababaaaaaaaaabaabbaaaabaaaaaaaaabbbabaabbbbbabaabaaabbbabbbabbbaaaaaabaaabbbbbbaa","abbaabaaaaabbaaaaaabbbbabaabbabbaabbbabbababaabaabaaabbababbaaabaababbbbbabbbabbabbaaaabbaababbaababbbabbbbbbaaabbbbbbb","baabababbbbbaabbbabaababaababaababbbabbbbbababbaababbaaaabaaabbbbaaaababbabbbabaabaabbababaaa","abbaabbbaabbabbabbbbbbbabbbabbaaabbaaababbaabbaababab","bbabbabbbbbbabababbbabaabbbaaaabababbaabbbabbbbaababbaabaaabbbbabaaaabbbabbaaabaabbaabbbaaababbaaaabaabbabbbabbbaaabaaabbbbabbaabbaabaa","aaaabbbabbaabbababbabbabaababbababaabbaaabaaaababbbabbaaaabbbbabaaabbbaaabababbbabbaabaaabbaabbbaabbbbaaabbbaabbbbababaaaaababbbabaabbbbbbabbabbbbbabaaabaaaaaabbaa","babaaabaabbaababaaabbaaababbbbbbbaabbbbbbbbabbaabbbbbbaaaaabbaabababaabbbabaaaaaaabbaabababaaabbabbabbaababbaaabbbaaaababbbbbabbbaabbbaaaabbabbaabbbaababbaaaabbaaaababbbbbb","abaababbaaabbbaaaaababaabbab","aabbaaaababbbabbbaaabaabababbabbbaabaaaabaabaaaabbabaabbaaabbbaaabbaabbabbbbaaabbbababbaabbaaaabbbabaabbbabbbbbbbaab","aabbbabbabaaaaabbabbababbbabbbbbbbbaabbbbabbbaabaabbaaababbbaaaaabbaaabbab","baaaabababaaababbaabbbabaaabbbbabbbbaaaabbabbbbbbbbababbaaaaabaabaaabbaabbbbbabababaabbbbaabbbbbabbaabaaabaababbbabbbabaababbaaaabbaaaaaabaababbbabaabbbaaabbbabbbaabbbbbbaabbabbbbabaabbbbaba","bbbaababaabaabbabbaabbabbaabbbbabaabbabbbbbbbabbaaaaababaaabbbaba","baaaaababaabaabaabbbbabbbbbaabbaabbaaababaabaababaabbaaabbabbbabbbaababababbaaaab","baabaaababbabbbaaaabbaabbaababbaababbbaabaabaaaaaabbbbababaaabaaabaababbaabbabbaababbbbbabbabbaabbaabbbabbbaabb","bbaaaaabbbaaabbbaaaaaaaaaabaaaaa","bbbbbbabaaaaabbbbaaabbabaababaabababbabbabaabababababbaabbabbbabbbababa","bbaabbbaabbabababaaaaaabbaabbababbbbabaabbbaabbabaabbbabbbabbaaabbabbababaaabbbababbabbbbbbbbaaaaabbaa","abaabbbaabbbbaabbabaabaaabaabaaaabbabbbabbaaabbbbababaabaaabaaaaaaaabaaaababbababaabbbbbaababaabbbbabbaaabbbabbabbbbabbbbaabaaa","bababbabbaaabbabaababbbbaabaabbbbbbababaabbbbaababababbaabbaabaaaababbabbabab","baaabbabbaaababbbbbbbaabaaabbabbaaabbabababbaaaabaabbbbaaaabbabbbbbbabaaaaabaabaaaaabababbbaabbaabbabbbbbabaababababbbbbbaabbbabbbaaabaabababaabaabbbbbbbbabaaaaabbaababab","ababababababbbabbabbbbbabbabbbbabbaaabbbbbbbbbbabbaabaabbbababbabbbaaaababbaabbbaab","baaaabbababbabaabbabbaabbbbabbbabbabbbbbabaaaabaabbbabbaababbabababaaaaabaaaababbbabbbaaaaabbbabbbaaaabbbbbaaaba","baababbbaaaabbbaaababbabaababbbbbaaabaabaaabababbbbaabbaaabaaabaaaaaabbbbbaabaaaababbbaabb","aaabaabbabaaaaaaaaaabbb","abbbaabaabbbbbabbaababbaaaaababbaaaaabbabbbb","ababaabababbbabbbbaaabbabbbaaaaaaabbabbbaba","baababbaabbbaabbbbbbaaabbbbaaaabbbbabaabbaaabaaababbbaaabbaabaabaabaaabbbbbaabaaaaab","babbabababaabbbaabababaaaaaaaaaabbbbabbababbbaaaabbaabababbbbbbbababaaaababbaaaabaabaaabaabaaaaababbbbababbaabbaaabbabaaababbbbbabbbaaabaababbaabbabbbbaaaabababaaa","abbbbbaaaaabbaabbbabaabbabaabbbaaabbaaabaabbb","abbababb","aababaaabbbabbbbaaaabaababbababbbaaaaabbababbbbaaaaaababababaabaaaabbbabbaababbbabbabaabbababbbbabbabbbabaaabababaababbbbbaaabaabaaaabbabbaaababbabaaaaa","abbbaaaaabaabbbabbbabbaaabbaababababbbaabbababaababaabbaaababbabbb","aaabaaabaabaababbabbbbaaaaaaaaabbbabbaabbababbaabababbbbbabbabababbabaaaabbbbabbbbbbbabbabaabababbaaabbaaaaaabbababbbbbbbaabbabbaaaababbabaaabbaabaaababaabaaaabaaba","baabbabbaabbbabbbbabbbaabbabaababaaaabaaaabbaaabaaababbabbbbbabaabbbaababaaababaababbaabaabaabababaaabbbbaabbbabbbbbba","abaababaaabaabbaabaaababbaabbbababbbaaaaaabbbabaaababbaabbbbaaabaabbaaabaaaababbabbbbbababbbaabbaaababaaaaaaababbbbbba","aaaabbaaaaaabbbaaaaabbaabbaabaabbababbbbbabababbababbabbaaaaabbaaabbabbaaabbbbbbaaabbbbbabbbbbabbabbaaaaaabbbbbaaaaaabbabbbbbbabbbaabbbaababbbbbabbaaabaa","ababbaaaababababbabaaabaaaaaabbbbababaababbababaabaabababaaaabbaaabaaaaaaabbbbababbabbbbabbbbbbabbbabaabbbabbbbbabbbbbababbbbaabbbaabbbababaaaabbbbaaabbab","bbabaababbabbbbbbaabbaaaabbaaabbabbaaabbabbaabaaabbbabbbababaabbbaaba","bbaaabbbaabaababbbababaaabbbbababbbbbaabaaabbbaabbbaaaaabbaabbaabaaabbabaababaaabbaababaabbbbbbaaabbabaabababaabbbaaaaabbbaaaabaabbababaaababaabbaabaaaaabaaaababbabaabababababaabaaaabaaabbaaabbbbababa","abbaaabbbaabbabb","abbbabbaaaabaabaaababaaaaabababbbaabbbbaabbbaaa","babaaabbbbbb","baaabaaabbbabaabbbaabaabbaaaabbbabbabbbbbaabbabbbabaabababaabbbbabaabaabbaaabbbabaaaaaaaaaabbbbaaabbaaaaaabaababbaabbabaabbbabaaabbbbaabbaababba","babababbbbabbaaaaaabbbbbaba","babba","abbbabaabbabbbbbbbbababaaaaaab","bbabbabbbabaaabbbaaababbbbaaaaaaabab","bbabbaabbbabaaaaaababaabbbabaaabaaababaabaaaaaaaaaaabbaababaababbababbabbababbbaaabbaaaabbaabbbbaaabbabbbabaabbbbbabababbaabaabbbabaabaaabaaababbbabbabbaababaabbbbaabaabbabbbbabbabbaababbbbba","bbaaabaaababaaaabbaabbabbbaabbaaabaababbaaababbbaaabaabaabbabababaaaabbbbbaaaabbbbbbababbbbabbbababbaababaababbbabaaabbabaaaabababaaabababaaabbbbbaaaaababaabbbbaabaaabba","ababaaaaaabbabbabba","aaabababaabaaabaaaaabaaabaababbbbbababbbabbbbbbaabbaaaaaba","baabbbab","abbaaaaababbbaaaabbbaaabbaaababbababababaabbabaabaaabaabaaabbaaabbababbaabaaaabaabababbbbbbabaabaaabaaaababbaababbaabbbbbaabbbbbbabaa","ababaaabbababbabbbaabbbaabaaaaaaaabbabaabaaaaaabaa"} |