力扣题解(环绕字符串中唯一的子字符串)

467. 环绕字符串中唯一的子字符串

定义字符串 base 为一个 "abcdefghijklmnopqrstuvwxyz" 无限环绕的字符串,所以 base 看起来是这样的:

  • "...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".

给你一个字符串 s ,请你统计并返回 s 中有多少 不同非空子串 也在 base 中出现。

思路:本题中要求求所有存在的非空字串,且字串不能重复。首先先求所有存在的字串数目。

dp[i]表示以i结尾的所有字串的数目,则dp[i]=dp[i-1](若第i个元素可以和前面的元素组成字串)或者为0(不能组成字串)。此时dp中存放着所有非空字串的数目,但需要去重。去重主要利用了字串之间的特点,即若以同一个字符结尾,则二者必定一个是另一个的子串(因为以同一个字符结尾前面一定一样),则只需要存放其中更大的那个就行(因为dp[i]存放以i位置字符结尾的所有字串的数目,一定包含更少的那一部分)。

初始化时dp中每个元素是1,因为只有本身一个字符一定能构成子串。

dp[i]+=dp[i-1],用+=,可以想成dp[i-1]的所有可能加上了最后一个字符的数目(dp[i-1]),和只有最后一个字符的数目(dp[i])之和构成新的dp[i];

class Solution {
public:
    int findSubstringInWraproundString(string s) {
        set<string>sets;
        int n=s.size();
        vector<int>ret(n,1);
        for(int i=1;i<n;i++)
        {
            if(s[i]-s[i-1]==1||s[i]=='a'&&s[i-1]=='z')
            {
                ret[i]+=ret[i-1];
            }
        }
         vector<int>num(26,0);
         for(int i=0;i<n;i++)
         {
            int low=s[i]-'a';
            num[low]=max(num[low],ret[i]);
         }       
         int sum=0;
         for(auto e:num)
         {
            sum+=e;
         }
         return sum;
    }
    
};

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 21:36:07       66 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 21:36:07       70 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 21:36:07       57 阅读
  4. Python语言-面向对象

    2024-07-12 21:36:07       68 阅读

热门阅读

  1. python连接kafka生产者发送消息

    2024-07-12 21:36:07       19 阅读
  2. 链路追踪详解(六):Zipkin 和 Jaeger 的安装方法

    2024-07-12 21:36:07       17 阅读
  3. 进制-奇怪的捐赠c++

    2024-07-12 21:36:07       19 阅读
  4. flutter 使用wechat_assets_picker的权限检测

    2024-07-12 21:36:07       15 阅读
  5. Sqlmap中文使用手册 - Request模块参数使用

    2024-07-12 21:36:07       16 阅读
  6. pdf文件如何快速英文转中文?

    2024-07-12 21:36:07       19 阅读
  7. Windows图形界面(GUI)-SDK-C/C++ - 编辑框(edit)

    2024-07-12 21:36:07       23 阅读
  8. 小红书后端

    2024-07-12 21:36:07       16 阅读