今日头条,双生词

今日头条,双生词,虽然没有过,还是写一下我的思路,请各位指教一下
第一种方法是用hash的方法做,过60%,后面就超时了
第二种方法是用trie树做,提交的时候没有考虑长度不相等的情况,考试结束才发现,不知道改过之后的代码能不能过
下面贴一下两种思路的代码。

#include "iostream"
#include "string"
#include "unordered_set"
#include "algorithm"

using namespace std;

int main(int, char*[]) {
    int t, n;
    while(cin >> t) {
        while(t--) {
            cin >> n;
            bool res = false;
            string str, dou, tmp;
            unordered_set<string> set;
            while(n--) {
                cin >> str;
                dou = str + str;
                for(int i = 0, len = str.size(); i < len; i++) {
                    tmp = dou.substr(i, len);
                    if(set.find(tmp) != set.end())
                        res = true;
                    reverse(tmp.begin(), tmp.end());
                    if(set.find(tmp) != set.end())
                        res = true;
                }
                set.insert(str);
            }
            cout << (res ? "Yeah" : "Sad") << endl;
        }
    }
}
#include "iostream"
#include "string"
#include "vector"
#include "algorithm"

using namespace std;

class Node {
public:
    Node *next[26];
    Node() {
        for(int i = 0; i < 26; i++)
            next[i] = nullptr;
    }
};

bool rechk(Node *root, string &str, int i) {
    if(i >= str.size() && root == nullptr)
        return true;
    int ind = str[i] - 'a';
    if(root->next[ind] == nullptr)
        return false;
    return rechk(root->next[ind], str, i+1);
}

bool check(Node *root, string &str) {
    string dou = str + str;
    string tmp;
    for(int i = 0, len = str.size(); i < len; i++) {
        tmp = dou.substr(i, len);
        if(rechk(root, tmp, 0))
            return true;
        reverse(tmp.begin(), tmp.end());
        if(rechk(root, tmp, 0))
            return true;
    }
    return false;
}

Node* add(Node *root, string &str, int i) {
    if(root == nullptr)
        root = new Node();
    if(i >= str.size())
        return root;
    int ind = str[i] - 'a';
    root->next[ind] = add(root->next[ind], str, i+1);
    return root;
}

int main(int, char*[]) {
    int t, n;
    while(cin >> t) {
        while(t--) {
            cin >> n;
            bool res = false;
            string str;
            Node *root = new Node();
            while(n--) {
                cin >> str;
                if(check(root, str))
                    res = true;
                add(root, str, 0);
            }
            cout << (res ? "Yeah" : "Sad") << endl;
        }
    }
    return 0;
}
#字节跳动##笔试题目#
全部评论
👍
点赞 回复 分享
发布于 2018-08-25 12:27
写了同一个题 头条
点赞 回复 分享
发布于 2018-08-25 18:28
楼主,基于字典树的第21行会出现越界问题,比如case: zyyhappy zyy 不同长度的解决方案,用标识isEnd来控制,贴一下我的代码,如果有问题,还望各位指正。 #include <iostream> #include <list> #include <vector> #include <map> #include <string> #include <algorithm> using namespace std; class Tire { public: Tire *next[26]; bool isEnd; Tire() { for(int i = 0 ; i < 26 ;i++) next[i] = nullptr; isEnd = false; } }; bool findSS(Tire *root, string s) { for(int i=0 ; i < s.size() ;i++) { int index = s[i] - 'a'; if(root->next[index] == nullptr) return false; root = root->next[index]; } return root->isEnd; } void addTire(Tire* node, string word) { for(int i = 0 ; i < word.size() ;i++) { int index = word[i] - 'a'; if(node->next[index] == nullptr) node->next[index] = new Tire(); node = node->next[index]; } node->isEnd = true; } int main() { int t,n; string s; cin >> t; while(t--) { cin >> n; Tire *root = new Tire(); vector<string> v; bool sign = false; for(int i = 0 ; i < n ; i++) { cin >> s; string new_s = s+s; for(int k = 0 ; k < s.size()+1 ;k++) { string find_s = new_s.substr(k,s.size()); if(findSS(root,find_s)) { sign = true; break; } reverse(find_***egin(), find_s.end()); if(findSS(root, find_s)) { sign = true; break; } } addTire(root, s); } if(sign) cout << "Yeah" << endl; else cout << "Sad" << endl; } }
点赞 回复 分享
发布于 2019-05-15 08:50

相关推荐

不愿透露姓名的神秘牛友
10-05 10:13
已编辑
HHHHaos:让这些老登来现在秋招一下,简历都过不去
点赞 评论 收藏
分享
投票
我要狠拿offer:如果不是必须去成都绝对选九院呀,九院在四川top1研究所了吧
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务