• leetcode 第388场周赛第三题


    这道题有很多人都用的什么字符串哈希或者别的一些法子,这里作者用了暴力的解法。

    思路:关键点在于我们怎么存储所给出的字符串容器中每个字符串的子串的编号并加以处理。

    这里用到了一种嵌套容器:vector>,这样我们既能知道是哪个字符串的子串,也能知道子串出现的次数。

    好了,这样的问题大部分就解决了,我们之所以用暴力的原因是因为这里的数据范围非常的小,足够我们用暴力进行处理。

    注意:里面为什么会对于m[n][i]进行计数,这个东西相当于对比器,就是存储的是所有字符串所拥有的子串的个数,而为什么直接比较m[i][当前字串]与m[n][当前字串],是因为m[i][当前子串]是对于它对应的一个字符串的子串,是一定只有一个的,而m[n][当前子串]就不一样了,这个是全部字符串的子集的个数计数,这样一比较才能知道这个子集是不是只出现了一次。

    第三重循环当中为什么初始值设为j,是因为防止所截取的字符串个数是0.

    上代码:

    1. class Solution {
    2. public:
    3. vector<string> shortestSubstrings(vector<string>& arr) {
    4. int n=arr.size();
    5. vector<map<string,int>>m(n+1);
    6. for(int i=0;i<n;i++){
    7. string buf=arr[i];
    8. for(int j=0;j<buf.size();j++){
    9. for(int k=j;k<buf.size();k++){
    10. m[i][buf.substr(j,k-j+1)]++;
    11. m[n][buf.substr(j,k-j+1)]++;
    12. }
    13. }
    14. }
    15. vector<string>res(n);
    16. for(int i=0;i<n;i++){
    17. string buf=arr[i];
    18. for(int j=0;j<buf.size();j++){
    19. for(int k=j;k<buf.size();k++){
    20. if(m[i][buf.substr(j,k-j+1)]==m[n][buf.substr(j,k-j+1)]){
    21. if(res[i].empty())res[i]=buf.substr(j,k-j+1);
    22. if(res[i].size()>buf.substr(j,k-j+1).size())
    23. res[i]=buf.substr(j,k-j+1);
    24. else if(res[i].size()==buf.substr(j,k-j+1).size())
    25. res[i]=min(res[i],buf.substr(j,k-j+1));
    26. }
    27. }
    28. }
    29. }
    30. return res;
    31. }
    32. };

  • 相关阅读:
    基础框架-Spring
    高数 |【2019数一真题】部分错题及经典题自用思路整理
    【无标题】
    AOSP10 替换系统launcher
    JSON 和 BSON的区别
    Web攻防--Java_SQL注入--XXE注入-- SSTI模板注入--SPEL表达式注入
    【THM】SQL Injection(SQL注入)-初级渗透测试
    linux中docker不能联网?
    java操作数据库的利器 DBCUtils
    Node.js简介
  • 原文地址:https://blog.csdn.net/m0_73917165/article/details/136603819