转载自九章算法(地址

题目:

假设s是一个无限循环的字符串”abcdefghijklmnopqrstuvwxyz”,s就是一个”...zabcdefghijklmnopqrstuvwxyza...”这样的字符串,现在给你另外一个字符串p,求p中存在多少个截然不同的子串,使得它们也是s的子串。p只包括英语的小写字母并且p的长度可能大于10000。

样例说明

输入:
输出:1
说明:只有'a'是s的子串。

输入:cac
输出:2 
说明:只有'a'和'c'是s的子串。

输入:zab 
输出:6
说明:'z','a','b','za','ab','zab'都是s的子串。

题解:

1. 这一题我们首先考虑的是,一个长为n的连续的串,有多少个符合题目要求的子串呢?经过思考我们可以得出长为n的连续的串,我们有1+2+3+...+n这么多个符合题目要求的子串。

2. 解决了上述这个问题,我们直接找出p中所有连续的子串的长度L1,L2,L3...Ln,我们若是直接对(1~L1)(1~L2)...(1~Ln)求和,我们得到的结果显然是错误的,因为会存在字符串重复的问题,例如abcdpjiezabc,这里abcd和zabc有一部分abc是重复的,我们要求有多少种不同的子串,就需要把这部分重复的减去。如果我们采用暴力计算的方法显然很麻烦,那么我们要如何才能避免计算到重复的呢?

3. 在我们学过的数据结构中,有一种数据结构可以避免重复,那就是哈希表!

在本问题中,我们也可以通过哈希表去重。对于一个符合条件的子串(符合条件指的是该串为p的子串),我们只需要记录“长度”和“结尾字符”这两个关键字就可以唯一确定这个子串。我们以abcdpjiezabc为例,两个符合条件的极大子串为abcd和zabc,对于abcd,我们把[1,a],[2,b],[3,c],[4,d]记录到哈希表。细心的读者可以发现,我们不需要记录[1,b],[2,c]等等,因为[2,b],[3,c]天然包含了长度比它们小的子串。对于zabc,我们记录[1,z],[2,a],[3,b][4,c]

4.得到哈希表之后,我们如何统计答案呢?

我们发现,对于[1,a],因为哈希表中已经存在[2,a],所以[1,a]所表示的子串已经在[2,a]中被统计。也就是说,为了避免重复统计,我们只需要记录某个字母结尾的、长度最大的那个符合条件的子串长度就可以了。假设我们的哈希表中对应某个字母P的最长子串长度为k,因为长为k的字符串,有k个子串是以P结尾的,那么我们需要给最终答案加上k,这种统计方式把所有可能的子串都记录其中,并且不会重复。综上我们的算法时间复杂度为遍历数组和更新哈希表的时间复杂度:O(N),空间复杂度为O(1)。

Solution

#include <iostream>
#include <algorithm>
#include <vector>
#include <string> using namespace std; int findSubstringInWraproundString(string &str) {
vector<int> dp(, );
int n = str.size();
int pos = ;
for (int i = ; i < n; ++i) {
if (i > && (str[i] - str[i - ] == || str[i] == 'a' && str[i - ] == 'z')) {
++pos;
}
else {
pos = ;
}
dp[str[i] - 'a'] = max(dp[str[i] - 'a'], pos);
}
int res = ;
for (int i = ; i < ; ++i) {
res += dp[i];
}
return res;
} int main()
{
string s;
while(cin >> s)
cout << findSubstringInWraproundString(s) << endl; system("pause"); return ;
}

【Google】循环字符串里面的独立子串的更多相关文章

  1. python实现无重复字符串的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度. 示例 1: 输入: "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc&qu ...

  2. 【Java】获取两个字符串中最大相同子串

    题目 获取两个字符串中最大相同子串 前提 两个字符串中只有一个最大相同子串 解决方案 public class StringDemo { public static void main(String[ ...

  3. HDU 4622 求解区间字符串中的不同子串的个数

    题目大意: 给定一个长度<2000的串,再给最多可达10000的询问区间,求解区间字符串中的不同子串的个数 这里先考虑求解一整个字符串的所有不同子串的方法 对于后缀自动机来说,我们动态往里添加一 ...

  4. java实现字符串匹配问题之求两个字符串的最大公共子串

    转载请注明出处:http://blog.csdn.net/xiaojimanman/article/details/38924981 近期在项目工作中有一个关于文本对照的需求,经过这段时间的学习,总结 ...

  5. pojg2744找一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是y的子串,或者x中的字符反序之后得到的新字符串是y的子串。

    http://poj.grids.cn/practice/2744 描述现在有一些由英文字符组成的大小写敏感的字符串,你的任务是找到一个最长的字符串x,使得对于已经给出的字符串中的任意一个y,x或者是 ...

  6. 核心API的使用(获取两个字符串的最大相同子串)

    /** * 获取两个字符串的最大相同子串. 例:abegad acegab */public class TheSameString { public static void main(String[ ...

  7. JS判断一个字符串是否包含一个子串函数.

    微信小程序 JS判断一个字符串是否包含一个子串函数. //str 字符串,name子串     contains:function(str,name){         if(str.indexOf( ...

  8. Js判断一个字符串是否包含一个子串

    Js中经常遇到判断一个字符串是否包含一个子串,java语言中有containes的方法,直接调用就可以了.除非引用第三方数据库,Js中没有contains方法. 为了实现更java语言中contain ...

  9. mysql判断一个字符串是否包含某子串 【转】

    文章出处:mysql判断一个字符串是否包含某子串 使用locate(substr,str)函数,如果包含,返回>0的数,否则返回0 例子:判断site表中的url是否包含'http://'子串, ...

随机推荐

  1. Cadence 15.7 win7无法启动解决方法

    原帖地址:http://blog.sina.com.cn/s/blog_69a5dce90100kscf.html 按照XP下的破解方法安装Cadence15.7后,  如果不能正常启动Cadence ...

  2. 九度OJ 1202:排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:19711 解决:6508 题目描述: 对输入的n个数进行排序并输出. 输入: 输入的第一行包括一个整数n(1<=n<=100). ...

  3. PostgreSQL 里面的 BIGSERIAL

    @Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id; CREATE TABLE article( id BIGS ...

  4. 图形数据库(GraphDB)

    Date: 2016-01-27 Title: 图形数据库-1 Published: true Type: post Excerpt: Category: GraphDB 图形数据库(GraphDB) ...

  5. Kindeditor 编辑区样式结构

    ke-container   ke-toolbar   ke-edit   ke-edit-iframe   ke-edit-area   ke-statusbar

  6. android客户端登录&注册的实现

    MainActivity多线程的实现: package com.example.loginconnect; import java.lang.ref.WeakReference; import jav ...

  7. 第二天----列表、深浅拷贝、元组、字符串、算数运算、字典、while

    列表 列表是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 基本操作: 索引切片追加删除长度切片循环包含 创建.查看列表: 列表中的数字不要加引号,列表的索引从0开始: lis ...

  8. Spring Cloud之网关

    接口的分类: 开放接口:可以授权一些接口口OAuth2.0协议方式  第三方联合登录 内部接口:  一般只能在局域网中进行访问,服务与服务之间关系都在同一个微服务系统中.目的是为了保证安全问题 接口设 ...

  9. BEM —— 源自Yandex的CSS 命名方法论

    原文链接: https://segmentfault.com/a/1190000000391762 人们问我最多的问题之一是在CSS类名中--和__是什么意思?它们的出现是源于BEM和Nicolas ...

  10. 随意谈谈tcp

    tcp作为四层中可靠到传输协议,为上层协议提供了字节流的可靠到传输,之所以能做到可靠主要因为以下几点: 1.流与分段:流即字节流,计算机处理程序时一般以字节为单位,如果上层协议接收到到是字节流并且跟发 ...