今日头条,双生词

今日头条,双生词,虽然没有过,还是写一下我的思路,请各位指教一下
第一种方法是用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;
}
#字节跳动##笔试题目#
全部评论
楼主,基于字典树的第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
写了同一个题 头条
点赞 回复 分享
发布于 2018-08-25 18:28
👍
点赞 回复 分享
发布于 2018-08-25 12:27

相关推荐

2025-12-02 21:34
中南大学 Java
我这边应该算是华为第一批开奖的了,还是要11月底才开,不过今年的流程整体比去年确实要开得早,这一点还是值得表扬的。然后华为也确实很有诚意,给我这样bg的硕鼠开了15a,并且base地还是在杭州,应该是buff拉满了,但凡其他公司开的没这个高,and对象没签上海,可能真选择成为华孝子了。虽然很有诱惑力,但是这个15a的offer里面确实还是有猫腻的:1.&nbsp;薪资构成是这样的,15a&nbsp;=&nbsp;(基本工资+绩效工资)*12&nbsp;+&nbsp;10w年终,虽然绩效工资hr说100%能拿满,年终大部分都能拿满,绩效工资能拿满我可能还选择相信,但10w年终还能拿满,这我就存疑了。反正看了一圈别家的公司报价都是报一般情况下能拿多少年终,比如美团0-6个月,就报3.5个月,但是华似乎是喜欢往最高了报,所以估计10w年终拿满应该也是极少数人。2.&nbsp;公积金只交5%,并且缴纳基数还只是按基本工资交的,这里看似每个月到手的钱变多了,但是总体算下来,可能一年比别家就少拿1-2w。3.&nbsp;月末周六要加班,可以选择调休或双倍加班费,并且平常应该也会加班,感觉不大会像hr说的124能8.30下班,35能5.30下班的,云计算bu强度应该还算比较好的,估计一般情况下9-9-5吧,但是不知道并入ict后会如何。4.&nbsp;还有相关的业务线,听说8,9月份云计算bu内部已经调整了一波,好像还要并入ict下面了,感觉未来的不确定性也比较大。5.&nbsp;华为的认可度应该比不过传统的互联网大厂,技术的前瞻性应该也比不过(个人看法)。6.&nbsp;培养和升职,感觉美团可能更有说法,毕竟见到过1年升L6的,甚至还有两年升L7的,对华为的了解相对较少,只知道华为可能相对稳定一些?毕竟4年一签?综上,还是决定放弃华,准备去团吧,自己选的路,希望不会后悔吧。
变形钢筋:这个薪资结构,年终奖是画大饼啊
OC/开奖
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务