(字符串)子串变位词
字符串 子串
2023-09-14 08:59:06 时间
题目:
给定两个串a和b,问b是否是a的子串的变位词,例如输入a=hello,b=lel,lle,ello都是true,但b=elo是false。(字串是连续的)
思路:
- 滑动窗口思想:动态维护一个“窗口”,比如b的长度是3,考察a[0..2],a[1..3],a[2..4]是否是b的变位词,关键在于如何与b比较?
- hash数组统计:基于字符的特殊性,可以用[0,255]的数组来统计字符出现的次数,假设都是小写的英文字母,则用[0,25]来表示b中每个单词出现的次数,通过记录非0次出现的个数nonZero。
- 窗口滑动,向右移动一位:
新窗口 a[i-lenb+1…i],旧窗口 a[i-lenb…i-1]
扔掉a[i-lenb],加入a[i],具体操作参考代码,文字表达不清。
代码:
#include <iostream> #include <vector> using namespace std; #define NUM 26 bool variable_bit_word(char *a,int lena,char *b,int lenb){ vector<int> cnt(26,0); int nonZero=0; // statistic of b for(int i=0;i<lenb;i++){ if(++cnt[b[i]-'a']==1) nonZero++; } // first slide window for(int i=0;i<lenb;i++){ int c=a[i]-'a'; --cnt[c]; if(cnt[c]==0) nonZero--; if(cnt[c]==-1) nonZero++; } if(nonZero==0) return true; for(int i=lenb;i<lena;i++){ int c=a[i-lenb]-'a'; ++cnt[c]; if(cnt[c]==1) nonZero++; if(cnt[c]==0) nonZero--; c=a[i]-'a'; --cnt[c]; if(cnt[c]==0) nonZero--; if(cnt[c]==-1) nonZero++; if(nonZero==0) return true; } return false; } int main() { char a[]="hello"; char b[]="lel"; int lena=sizeof(a)/sizeof(a[0])-1; int lenb=sizeof(b)/sizeof(b[0])-1; cout<<variable_bit_word(a,lena,b,lenb)<<endl; return 0; }
相关文章
- Python 编程骚操作连载(一)- 字符串、列表、字典和集合的处理(Part B)
- python 字符串转列表,列表转字符串
- python判断是否为数字类型_python判断字符串是否为数字
- Jst刷LeetCode--字符串类解题技巧
- 2023-01-08:小红定义一个仅有r、e、d三种字符的字符串中, 如果仅有一个长度不小于2的回文子串,那么这个字符串定义为“好串“。 给定一个正整数n,输出
- 【字符串】最长回文子串 ( 中心线枚举算法 )
- 【字符串】最长回文子串 ( 动态规划算法 ) ★
- 【Kotlin】Kotlin 常用表达式 ( range 范围表达式 | when 条件表达式 | 字符串模板 )
- Go语言字符串
- sqlserver、mysql获取连接字符串步骤
- 研究 Oracle 中的循环字符串(oracle循环字符串)
- PHP插入空字符串 到int字段报错的方法详解编程语言
- ABAP 字符串截取,存储详解编程语言
- 度MySQL中实现字符串相似度比较(mysql字符串相似)
- Oracle空字符串的使用方法与注意事项(oracle空字符串)
- MySQL中使用IN关键字时,字符串的长度有限制吗(mysql中in长度)
- 利用Oracle提取字符串的子串(oracle中子串)
- C语言-字符串函数的实现(四)之strcmp
- asp实现二进制字符串转换为Unicode字符串
- PHP截取字符串分别适合GB2312和UTF8编码情况
- JS字符串连接[性能比较]
- SQL截取字符串应用代码
- 基于C++字符串替换函数的使用详解
- PHP将字符分解为多个字符串的方法
- Asp.Net中的字符串和HTML十进制编码转换实现代码