467.环绕字符串,每日一题
字符串 每日
2023-09-27 14:26:29 时间
题目:
把字符串 s 看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,所以 s 看起来是这样的:
"...zabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcd...." .
现在给定另一个字符串 p 。返回 s 中 唯一 的 p 的 非空子串 的数量
题目意思:
存在一个收尾相连的26个字母的循环字符串s,给定一个字符串p,需要求p中连续的最长串的子串长度(相当于s而言,连续到的,因为s中z和a是连在一起的,所以zab是连续三个,abcb是连续最长3->abc)
思路:
可以用动态规划dp[i]来记录i之前用多少个连续的字母,dp[i] 记录了当前位置有多少个连续字母,一个连续字母的子串数量正好等于每个连续字母dp[i]之和,同时dp[]在创建的时候,加入哈希思路,可以去重;
代码:
/*
*findSubstringInWraproundString:把字符串 s 看作是 “abcdefghijklmnopqrstuvwxyz” 的无限环绕字符串,现在给定另一个字符串 p 。返回 s 中 唯一 的 p 的 非空子串 的数量
char * p:给定的目标字符串
返回值:s 中 唯一 的 p 的 非空子串 的数量
*/
#define MAX(a, b) ((a) > (b) ? (a) : (b))
int findSubstringInWraproundString(char * p){
int dp[26];
memset(dp,0,sizeof(dp));
int p_len=strlen(p);
int i;
int k = 0;
int sum = 0;
for(i=0;i<p_len;i++)
{
if(i && (p[i]-p[i-1]+26)%26 == 1)
{
k++;
}
else
{
k=1;
}
dp[p[i] - 'a'] = MAX(dp[p[i] - 'a'], k);
}
for(i=0;i<26;i++)
{
sum += dp[i];
}
return sum;
}
相关文章
- 【转】SQL Server一个字段串拆分成多行显示或者多行数据合并成一个字符串(STRING_AGG、STRING_SPLIT)
- mybatis if判断字符串
- java字符串
- c# 图片转二进制/字符串 二进制/字符串反转成图片
- Lua 字符串查找函数 string.find(s, pattern [, init [, plain]] )【转】
- redis——数据结构(字典、链表、字符串)
- js 去除字符串中的空格
- LeetCode·每日一题·1653. 使字符串平衡的最少删除次数·前缀和
- LeetCode·每日一题·2287.重排字符形成目标字符串·数学
- LeetCode·每日一题·1807.替换字符串中的括号内容·哈希
- LeetCode·每日一题·1758.生成交替二进制字符串的最少操作数·模拟
- LeetCode·每日一题·1668.最大重复子字符串·模拟
- LeetCode·每日一题·1790.仅执行一次字符串交换能否使两个字符串相等·模拟
- LeetCode·每日一题·1784.检查二进制字符串字段·模拟
- Java中字符串相等与大小比较
- Python中str类型的字符串写入二进制文件时报TypeError错的处理方式
- Python中判断字符串是否为数字、字母、标识符、浮点数、大小写、可打印的方法
- Java 字符串(String)转成数字int的方法及示例代码
- char型指针和字符串字面量和字符数组