【string】hash table, two pointers, string

利用hash table, two pointers, string的题目。

1.求最长不重复子串的长度

hash table体现在一个数组,下标是字符串中元素的ASCII值,下标对应的元素代表该元素在字符串中出现的位置。

two pointers体现在用i一步步向前移去遍历字符串中的元素,作为不重复子串的末尾位置;用j指向不重复字符区间的首字符的位置。

 1 /***************************
 2 @date 4.23
 3 @description   https://leetcode.com/problems/longest-substring-without-repeating-characters/
 4 Given a string, find the length of the longest substring without repeating characters.
 5 For example, the longest substring without repeating letters for "abcabcbb" is "abc", which the length is 3.
 6 For "bbbbb" the longest substring is "b", with the length of 1.
 7 @tags: hash table, two pointers, string
 8 用一个0~255的数组,数组下标是字符的ASCII值,数组里的内容初始化都为-1,表现未出现。
 9 当其在字符串中出现,则赋值为当前字符在字符串中的下标;
10 变量i代表不重复字符区间末端的位置;j代表不重复字符区间第一个字符的位置;
11 当第一次出现重复字符时,该下标对应的值肯定是比j要大,此时将j赋值为该下标的后一位num[s[i]] + 1, i继续向前移,j<i
12 每次计算连续不重复字符的个数,并将其与max_len对比
13 ******************************/
14
15 #include <iostream>
16 #include <string>
17 #include <memory.h>
18 using namespace std;
19
20 class Solution{
21 public:
22     int lengthOfLongestSubstring(string s){
23         int max_len = 0, len = 0;
24         int num[256];
25         memset(num, -1, sizeof(num)); // 初始化为-1,表示没有出现过
26         for (int i = 0, j = 0; i < s.size(); ++i){
27             if (num[s[i]] < j)
28                 len = i - j + 1;    // 统计连续不重复字符的个数
29
30             else   // 如果第二次出现
31                 j = num[s[i]] + 1;
32             if (max_len < len)
33                 max_len = len;
34            num[s[i]] = i;
35         }
36         return max_len;
37     }
38
39 };
40
41
42 int main(){
43     Solution a;
44     cout << a.lengthOfLongestSubstring("abcdefgabcdefgh");
45 }

2.子串变位词

hash table体现在一个数组,下标是字符串中字符的ASCII-‘a‘,相当于0~25;下标对应的元素表示该字符出现的次数。

动态维护一个子串长度的窗口,a[i-lenb+1]~a[i]

 1 /*********************
 2 @date 4.22
 3 @description
 4 给定两个串a和b,问b是否是a的子串的变位词。(假设只含有全英的小写字母a~z)
 5 例如输入a = hello, b = lel, lle, ello都是true,但是b = elo是false。
 6 @tags: string, hash table, two pointers
 7
 8 ********************/
 9
10 #include <iostream>
11 #include <string>
12
13 using namespace std;
14
15 class Solution{
16 public:
17     bool subStringAnagram(string a, string b){
18         int nonZero = 0;
19         int num[26] = {0};
20         int lena = a.size();
21         int lenb = b.size();
22
23         if (lena < lenb)
24             return;
25
26         for (int i = 0; i < lenb; i++)
27             if (++num[b[i] - ‘a‘] == 1) ++nonZero; // nonZero 有多少个字符非0次出现
28
29
30         for (int i = 0; i < lenb; ++i){   // 第一个窗口单独开,因为第一个窗口的第一个元素不能丢
31             int c = a[i] - ‘a‘;
32             --num[c];                       // 此时的num[]变成了a,b对应元素出现的次数的差值
33             if (num[c] == 0) --nonZero;
34             else if(num[c] == 1) ++nonZero;
35             if (nonZero == 0) return true;
36         }
37
38         for(int i = lenb; i < lena; ++i){
39             int c = a[i-lenb] - ‘a‘;
40             ++num[c]; // 扔掉a[i-lenb];   // 新窗口是a[i-lenb+1]...a[i]
41             if (num[c] == 1) ++nonZero;
42             else if(num[c] == 0) --nonZero;
43             c = a[i] - ‘a‘;               // 旧窗口是a[i-lenb]....a[i-1]
44             --num[c]; // 加入a[i]
45             if (num[c] == 0) --nonZero;
46             else if(num[c] == -1) ++nonZero;
47             if (nonZero == 0) return true;
48         }
49     }
50 };
51
52
53 int main(){
54     Solution a;
55     cout << a.subStringAnagram("hello", "ell");
56 }
时间: 2024-10-26 09:01:51

【string】hash table, two pointers, string的相关文章

【leetcode】Reverse Words in a String

问题:给定一个字符串,字符串中包含若干单词,每个单词间由空格分隔,将单词逆置,即第一个单词成为最后一个单词,一次类推. 说明:字符串本身可能包含前导空格或后导空格,单词间可能包含多个空格,要求结果中去掉前导和后导空格,单词间空格只保留一个. 与rotate函数类似,先逆置每个单词,再将所有字符串逆置. void reverseWords(string &s) { if(s.size() == 0) return; char blank = ' '; size_t len = s.size();

【leetcode】Reverse Words in a String (python)

陆陆续续几个月下来,终于把题刷完了,过程中遇到的python的题解很少,这里重新用python实现下,所以题解可能都是总结性的,或者是新的心得,不会仅针对题目本身说的太详细. def reverseWords(self, s): s = ' '.join(s.split()[::-1]) return s [ : :  -1 ] 是将元素进行翻转 [leetcode]Reverse Words in a String (python),布布扣,bubuko.com

【题解】AGC007E Shik and Copying String(贪心)

[题解]AGC007E Shik and Copying String(贪心) 刚开始看完题以为是一个老鼠进洞模型,不过发现这里还要求不同种类的匹配不可香蕉,而且代价不是一定的... 追踪最终得到的串\(T\)每个字符\(T_i\)的来源,可以发现是一条引向\(p<i\)的折线,可以发现这条直线覆盖的\(x\)轴上的长度越小越好,最终答案是所有形如这样的匹配的折线中拐点最多的折线的拐点个数.用一个双端队列维护当前匹配的拐点的\(x\)坐标,从后向前考虑\(T\)中每个字符的匹配. 设当前枚举到\

【总结】alter table *** add constraint *** 用法

1. 主键约束 要对一个列加主键约束的话,这列就必须要满足的条件就是非空.因为主键约束:就是对一个列进行了约束,约束为(非空.不重复). [格式]alter table 表格名称 add constraint 约束名称 增加的约束类型 (列名) 例子:要对一个列加主键,列名为id,表名为emp alter table emp add constraint ppp primary key (id) 2. check约束就是给一列的数据进行了限制 [格式]alter table 表名称 add co

【分享】w32service table XPsp2

Ord   Address   fnAddr   Symbols-------------------------------- [  0] BF999280: BF93569A (win32k!NtGdiAbortDoc (bf93569a))[  1] BF999284: BF94724B (win32k!NtGdiAbortPath (bf94724b))[  2] BF999288: BF87A90C (win32k!NtGdiAddFontResourceW (bf87a90c))[ 

【CF662C】Binary Table 按位处理

[CF662C]Binary Table 题意:给你一个$n\times m$的01网格,你可以进行任意次操作,每次操作是将一行或一列的数都取反,问你最多可以得到多少个1? $n\le 20,m\le 10^5$ 题解:我也不知道叫啥了,说状压也不对,说fwt也不太对,就叫按位处理得了. 显然有$O(2^nm)$暴力,先枚举每行是否取反,然后枚举每列,如果0多就取反,否则不取. 但我们发现我们完全可以将本质相同的列一起处理,什么叫本质相同的列呢?假如我们对每行是否取反的状态为S,则所有$xor

【CF662C】Binary Table(FWT)

[CF662C]Binary Table(FWT) 题面 洛谷 CF 翻译: 有一个\(n*m\)的表格(\(n<=20,m<=10^5\)), 每个表格里面有一个\(0/1\), 每次可以将一行或者一列的\(01\)全部翻转 回答表格中最少有多少个\(1\) 题解 发现\(n\)很小,\(m\)很大 状压是跑不掉了 如果我们确定翻转哪些行,那么答案唯一确定(贪心的选每一列中\(0/1\)的较小值) 相同的列显然可以合并, 把每一列按照\(01\)状压,记\(a[i]\)为状态为\(i\)的列

【CodeForces】889 B. Restoration of string

[题目]B. Restoration of string [题意]当一个字符串在字符串S中的出现次数不小于任意子串的出现次数时,定义这个字符串是高频字符串.给定n个字符串,求构造出最短的字符串S满足着n个字符串都是高频字符串,若不存在输出NO,若存在多个输出字典序最小的一个.n<=10^5,Σ|si|<=10^5. [算法]模拟(图论?字符串?) [题解]首先出现频率都是1次,多次没有意义,所以每个字母至多出现一次. 那么对于出现在n个字符串中的子串ab,要求在S中ab也必须相邻. 所以对n个

【转】探秘Java中的String、StringBuilder以及StringBuffer

探秘Java中String.StringBuilder以及StringBuffer 相信String这个类是Java中使用得最频繁的类之一,并且又是各大公司面试喜欢问到的地方,今天就来和大家一起学习一下String.StringBuilder和StringBuffer这几个类,分析它们的异同点以及了解各个类适用的场景.下面是本文的目录大纲: 一.你了解String类吗? 二.深入理解String.StringBuffer.StringBuilder 三.不同场景下三个类的性能测试 四.常见的关于