leetcode 467. 环绕字符串中唯一的子字符串
Posted hdyss
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 467. 环绕字符串中唯一的子字符串相关的知识,希望对你有一定的参考价值。
题目描述:
把字符串 s
看作是“abcdefghijklmnopqrstuvwxyz”的无限环绕字符串,所以 s
看起来是这样的:"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd....".
现在我们有了另一个字符串 p
。你需要的是找出 s
中有多少个唯一的 p
的非空子串,尤其是当你的输入是字符串 p
,你需要输出字符串 s
中 p
的不同的非空子串的数目。
注意: p
仅由小写的英文字母组成,p 的大小可能超过 10000。
示例 1:
输入: "a" 输出: 1 解释: 字符串 S 中只有一个"a"子字符。
示例 2:
输入: "cac" 输出: 2 解释: 字符串 S 中的字符串“cac”只有两个子串“a”、“c”。.
示例 3:
输入: "zab" 输出: 6 解释: 在字符串 S 中有六个子串“z”、“a”、“b”、“za”、“ab”、“zab”。
思路:如例3,当字符串为‘z‘时,子串只有‘z‘,个数为1;当字符串为‘za‘时,字串有‘z‘,‘a‘,‘za‘,个数为3,和字符串‘z‘相比,新增子串个数为2;
字符串‘zab‘,新增子串有‘b‘,‘ab‘,‘zab‘3个。
也就是说按序的字符串每增加一个,新增的字串个数加1。
建一个数组,存储每次新增的子串个数,最后统计数组中数字的和。
题目链接:https://leetcode-cn.com/problems/unique-substrings-in-wraparound-string/
class Solution { public: int findSubstringInWraproundString(string p) { int maps[27]; int m[2]; int len,num = 0; memset(maps,0,sizeof(maps)); for(int i = 0;i<p.size();i++) { if(i == 0) { len = 1; maps[p[i]-‘a‘] = 1; } else { if(p[i-1] == p[i]-1 || (p[i] == ‘a‘ && p[i-1] == ‘z‘) ) //如果连续,则新增子串数加1 { len++; } else { len = 1; } if(len > maps[p[i]-‘a‘]) //存储子串个数 { maps[p[i]-‘a‘] = len; } } } for(int i = 0;i<26;i++) { num = num + maps[i]; } return num; } };
以上是关于leetcode 467. 环绕字符串中唯一的子字符串的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 467 环绕字符串中唯一的子字符串[动态规划] HERODING的LeetCode之路
LeetCode 965. 单值二叉树 / 467. 环绕字符串中唯一的子字符串 / 699. 掉落的方块(线段树后面再写)