• 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. };

  • 相关阅读:
    产品原型绘制要求与规范
    CMT2380F32模块开发20-射频收发例程
    Fabric.js 使用纯色遮挡画布(前景色)
    二分查找(JavaScript版本)
    SpringBoot整合MongoDB
    小程序学习笔记
    Spring-AOP
    Python从入门到实践:包的使用
    快速了解服务器单CPU与双CPU
    【电商项目实战】修改密码(详细篇)
  • 原文地址:https://blog.csdn.net/m0_73917165/article/details/136603819