![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
字符串
算法-字符串
free1993
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 38. 字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。示例一输入:s = “abc”输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]代码class Solution {public: int n; vector<string> ans; void DFS(int cur, string str, vector<bool> & vis, string原创 2021-06-22 17:20:42 · 53 阅读 · 0 评论 -
剑指 Offer 58 - I. 翻转单词顺序
题目输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例一输入: “the sky is blue”输出: “blue is sky the”代码class Solution {public: string reverseWords(string s) { int n = s.size(); int l =原创 2021-06-21 15:50:04 · 45 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
题目请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度示例一输入: “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。思路用一个hash来存储已经访问过得字母,然后使用双向指针来记录此时的右边界和左边界。本质上就是求两个相同字母之间的距离的最大值。代码class Solution {public: int lengthOfLongestSubstring(string s) { int n =原创 2021-06-20 14:45:39 · 56 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
题目输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。思路这道题的坑在于本来应该全部用字符串来表示,但是题目让返回int。当n过大的时候,这肯定会爆int的代码class Solution {public: int str2int(string s){ int ans = 0; for(auto c : s){ ans = ans * 10 + c - '原创 2021-03-28 14:43:54 · 39 阅读 · 0 评论 -
leecode.1759. 统计同构子字符串的数目
题目给你一个字符串 s ,返回 s 中 同构子字符串 的数目。由于答案可能很大,只需返回对 109 + 7 取余 后的结果。同构字符串 的定义为:如果一个字符串中的所有字符都相同,那么该字符串就是同构字符串。子字符串 是字符串中的一个连续字符序列。示例一输入:s = “abbcccaa”输出:13解释:同构子字符串如下所列:“a” 出现 3 次。“aa” 出现 1 次。“b” 出现 2 次。“bb” 出现 1 次。“c” 出现 3 次。“cc” 出现 2 次。“原创 2021-03-02 09:10:38 · 138 阅读 · 0 评论 -
leecode.395. 至少有 K 个重复字符的最长子串
题目给你一个字符串 s 和一个整数 k ,请你找出 s 中的最长子串, 要求该子串中的每一字符出现次数都不少于 k 。返回这一子串的长度。示例一输入:s = “aaabb”, k = 3输出:3解释:最长子串为 “aaa” ,其中 ‘a’ 重复了 3 次。思路分析对于这种题目找子串长度的问题,一般就两种:DP或者滑动窗口。对于滑动窗口来说,我们采用两个指针l,r,如果在这个区间内子串满足上述条件,我们就可以统计窗口大小,然后找最大值。但是上面思路存在两个问题:首先如何判断字符最少出现k次原创 2021-02-27 17:36:25 · 79 阅读 · 0 评论 -
leecode.76. 最小覆盖子串
题目给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。注意:如果 s 中存在这样的子串,我们保证它是唯一的答案。示例一输入:s = “ADOBECODEBANC”, t = “ABC”输出:“BANC”思路分析使用一个滑动窗口,使得窗口里面的字母始终满足覆盖。代码class Solution {public: string minWindow(string s, string t)原创 2021-01-05 13:25:19 · 59 阅读 · 0 评论 -
leecode.1138.字母板上的路径
题目字母板上的路径我们从一块字母板上的位置 (0, 0) 出发,该坐标对应的字符为 board[0][0]。在本题里,字母板为board = [“abcde”, “fghij”, “klmno”, “pqrst”, “uvwxy”, “z”],如下所示。思路首先这道题每个字母在板上的位置是固定的。所以就变成了两个固定位置之间的偏移。注意的地方这道题很坑的地方在于,z的位置。对于从z到其他字母,应该是按照先上再右的顺序;从其他字母到z的顺序,应该是按照先左再下的顺序。代码cla原创 2020-12-13 15:18:24 · 90 阅读 · 0 评论 -
leecode1023.驼峰式匹配
题目驼峰式匹配如果我们可以将小写字母插入模式串 pattern 得到待查询项 query,那么待查询项与给定模式串匹配。(我们可以在任何位置插入每个字符,也可以插入 0 个字符。)给定待查询列表 queries,和模式串 pattern,返回由布尔值组成的答案列表 answer。只有在待查项 queries[i] 与模式串 pattern 匹配时, answer[i] 才为 true,否则为 false。示例输入:queries = [“FooBar”,“FooBarTest”,“FootBall原创 2020-12-13 14:12:55 · 116 阅读 · 0 评论 -
leecode.583.两个字符串的删除操作
题目两个字符串的删除操作给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。实例输入: “sea”, “eat”输出: 2解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"思路这道题就是找两个字符串的最长公共子序列(LCS)的长度。删除除了LCS的字符。代码class Solution {public: int minDistance(string word1, stri原创 2020-12-13 13:32:03 · 76 阅读 · 0 评论 -
leecode.1529.灯泡开关
题目房间中有 n 个灯泡,编号从 0 到 n-1 ,自左向右排成一行。最开始的时候,所有的灯泡都是 关 着的。请你设法使得灯泡的开关状态和 target 描述的状态一致,其中 target[i] 等于 1 第 i 个灯泡是开着的,等于 0 意味着第 i 个灯是关着的。有一个开关可以用于翻转灯泡的状态,翻转操作定义如下:选择当前配置下的任意一个灯泡(下标为 i )翻转下标从 i 到 n-1 的每个灯泡翻转时,如果灯泡的状态为 0 就变为 1,为 1 就变为 0 。返回达成 target 描述原创 2020-12-13 13:20:44 · 158 阅读 · 0 评论 -
leecode.1358.包含所有三种字符的子字符串数目
题目包含所有三种字符的子字符串数目思路采用双指针,每次都找到包含a,b,c的最小窗口的长度。那么之后所有的字符加进来都是可以满足条件的代码class Solution {public: int numberOfSubstrings(string s) { int l = 0, r = l, ans = 0; int cur[3] = {0}; while(l < s.size() - 2){ while(r原创 2020-12-13 13:05:03 · 68 阅读 · 0 评论 -
leecode.1247.交换字符使得字符串相同
题目交换字符串使得字符串相同思路分析因为字符串里面只有x,y两种字符。我们需要统计不同位置上x,y的个数交换先有限同类交换,也就是对于都是xy类型,(s1:xx,s2:yy)或者yx类型(s1:yy s2:xx。如果交换完同类,发现还有剩余,交换xy和yx类型,需要2次。代码class Solution {public: int minimumSwap(string s1, string s2) { int tot1 = 0, tot2 = 0,ans = 0;原创 2020-12-13 11:52:06 · 138 阅读 · 0 评论 -
leecode.1456.定长字符串中元音的最大数目
题目定长字符串中元音的最大数目思路维护一个长度为k的滑动窗口,根据窗口两侧的元音字母的个数来统计当前最长的数值。注意点加一个哨兵,以免没有判断最后的而一次结果。不要用if去判断,用if直接会超时。直接加减就好了。代码class Solution {public: bool isvalid(char c){ return c == 'a' || c == 'e' || c == 'i' || c =='o' || c == 'u'; } int m原创 2020-12-13 11:32:08 · 85 阅读 · 0 评论 -
leecode537.复数乘法
题目链接复数乘法思路分析首先先提取a+bi中的a和b计算结果中的a和b将结果中的a,b通过int2string函数转换成string类型。代码class Solution {public: void getNum(string a, int &a1, int &b1){ int n1 = a.find('+'); bool flag = true; for(int i = 0;i < a.size() - 1;原创 2020-12-13 10:14:53 · 60 阅读 · 0 评论 -
leecode.1451.重新排列句子中的单词
题目重新排列句子中的单词思路分析使用一个map来存储所有的字符串遍历map输出结果注意的点首先处理句头的大小写问题。大写字母和小写字母的ASCII码差32.遍历原字符串的过程可能会出现越界。这个过程需要加一个哨兵。最后处理结果中的最后一个空格问题和句头的大小写。代码class Solution {public: string arrangeWords(string text) { map<int, vector<string>>原创 2020-12-12 18:02:43 · 120 阅读 · 0 评论 -
leecode.1003.检查替换后的词是否有效
题目检查替换后的词是否有效思路分析这道题就是遍历字符串,看是不是由abc,ab+c,a+bc组成的。使用一个数组来储存遍历过程中的字符串。当当前数组长度大于三的时候,检查最后的字符串是否为abc。如果是的话,就消除最后三个,如果不是,继续入数组。(有点像消消乐的感觉)注意点当遍历完所有的字符之后,可能数组里面刚好剩余abc,但是因为退出循环了,因此此时没法消除。所以为了解决这个问题,我们家一个哨兵‘!’,如果当前字符串合法,那么最后处理完的数组应该长度是1.代码class Solution原创 2020-12-12 17:32:41 · 72 阅读 · 0 评论 -
leecode.1513.仅含1的子串数
题目链接仅含1的子串数思路分析遍历字符串,找到当前字串最大的长度,其对应的总数使从1累加到n。代码class Solution {public: const int mod = 1e9 + 7; int numSub(string s) { int l = 0, r = 0,ans = 0,n = s.size(); s += '0'; while(r < n){ while(s[l] == '0')原创 2020-12-12 16:29:27 · 266 阅读 · 0 评论 -
leecode.1404.将二进制表示减到1的步骤数
题目将二进制表示减到1的步骤数思路分析模拟二进制的移位和加法操作,这里要注意最高位还存在进位的情况,也就是字符串全为1的情况。代码class Solution {public: int numSteps(string s) { int ans = 0, n = s.size(); string end = ""; for(int i = 0;i < n ;i++) end += '0'; end[n - 1] = '1原创 2020-12-12 15:35:27 · 82 阅读 · 0 评论 -
leecode.678.有效的括号字符串
题目有效的括号字符串思路分析按照下面的原则进行匹配:遇到左括号或者*的时候,将这两者的位置压入栈。遇到右括号,先去匹配左括号。如果左括号不够匹配,再去匹配*,如果两个都不够匹配的话,证明当前字符串不合法。如果上面的匹配结束了,此时我们就只剩左括号和*,如果左括号在* 前面证明此时的*相当于右括号。因此我们只需要检查左括号是否可以匹配完。代码class Solution {public: bool checkValidString(string s) { vecto原创 2020-12-12 14:54:58 · 46 阅读 · 0 评论 -
leecode.1419.数青蛙
题目数青蛙代码class Solution {public: int minNumberOfFrogs(string croakOfFrogs) { vector<vector<int>> pos(5); map<char, int> mapTable = {{'c', 0},{'r', 1}, {'o', 2},{'a', 3},{'k', 4}}; for(int i = 0;i < croakOf原创 2020-12-11 17:19:24 · 94 阅读 · 0 评论 -
leecode-1156.单字符重复子串的最大长度
题目单字符重复子串的最大长度思路代码class Solution {public: int maxRepOpt1(string text) { int n = text.size(); if(n == 1) return 1; map<char, int> hashStr; text += "#"; for(int i = 0;i < n;i++){ if(hashSt原创 2020-12-11 10:45:01 · 498 阅读 · 0 评论 -
leecode-316
题目去除重复字母思路利用栈来做代码class Solution {public: string removeDuplicateLetters(string s) { map<char, int> sPos; map<char, bool> vis; for(int i = 0;i < s.size();i++){ sPos[s[i]] = i; vis[s[i]]原创 2020-12-10 10:31:09 · 60 阅读 · 0 评论 -
leecode1371.每个元音包含偶数次的最长子字符串
题目每个元音包含偶数次的最长子字符串思路分析代码class Solution {public: int findTheLongestSubstring(string s) { vector<int> pos(1 << 5, -1); int ans = 0; int state = 0, tot = 1; pos[0] = 0; for(auto c : s){原创 2020-12-09 19:09:49 · 74 阅读 · 0 评论 -
leecode443.压缩字符串
题目压缩字符串思路分析因为本题要求O(1)的空间复杂度,所以采用双指针的方法,直接对原数组进行遍历。然后通过tot更新数组中的字符串。注意点处理数组越界的情况,也就是当数组遍历到最后一个元素。处理数字的表示形式。代码class Solution {public: int compress(vector<char>& chars) { int l = 0, r = 0, n = chars.size(), tot = 0;原创 2020-12-08 16:52:30 · 73 阅读 · 0 评论 -
leecode.165比较版本号
题目比较版本号思路按照’.'将所有的数字进行解析,同时处理掉尾部的0.从头开始比较两个的大小注意点为了防止数组可以正常解析,在所有的字符串的尾部加上哨兵’.’。比较的时候也将尾部无效的数字0全部pop掉。处理两个数组大小不一样的情况。代码class Solution {public: vector<int> getNum(string str){ int sum = 0; vector<int> ans;原创 2020-12-08 15:34:45 · 63 阅读 · 0 评论 -
leecode-93.复原IP地址
题目复原IP地址思路分析本题就是在一串字符串里面找到三个可以插入’.'的位置,保证分割之后的子字符串满足IP编码的方式。因此我们采用递归的方式进行探索。每次DFS的过程中有三个变量,分别存储当前使用的’.‘的次数,最新插入的’.'的位置,当前的字符串。每次从上次的位置开始探索,是否满足可以分割的条件。代码class Solution {public: int n;//字符串的长度 string str;//存储原字符串 vector<string> a原创 2020-12-07 20:32:52 · 90 阅读 · 0 评论 -
leecode49-字母异位词分组
题目字母异位词分组思路找到一个键值,但是有个问题在于键值要怎么定,来避免冲突的哈希地址,自然而言就想到了素数的乘积的方式。也就是给每一个字母赋予一个素数,以总体计算的数值作为键值。但是这样会存在一个问题,素数的成绩经过后台的测试会爆int和long long,因此这道题只能用double来存储最终的键值。代码class Solution {public: //26个素数 vector<double> table = {2,3,5,7,11,13,17,19,23,29原创 2020-12-03 19:05:31 · 64 阅读 · 0 评论 -
leecode91-解码方法
题目解码方法思路我们使用dp来做,令dp[i]表示前i个字符串可以匹配的编码方式的总数。有以下的测试用例:200 不合规20 [20]1021 [10,2,1] [10,21]4021 不合规根据上面的例子,我们发现,出现在字符串中间的0必须满足组成20或者10,否则是不合规的。因此,我们首先判断当前字符是否能和前面的字符组成10~26。如果可以,当组成的数字时20/10的时候,dp[i]=dp[i-2];如果组成的数字非20/10,有两种可能,单独组成一个和两个合并,因此转移方程dp[i原创 2020-12-03 18:38:38 · 163 阅读 · 0 评论 -
leecode151:反转字符串里的单词
题目反转字符串里的单词思路首先我们按照空格将所有的单词分隔开,然后将分割开单词依次入栈,最终一个个出栈。trick1.首先为了防止查找过程出现溢出,给字符串末尾设置了一个哨兵2.处理出栈时的空格问题代码class Solution {public: string reverseWords(string s) { s += " "; stack<string> myStack; for(int i = 0;i < s.原创 2020-12-03 16:57:33 · 73 阅读 · 0 评论 -
leecode22.括号生成
题目括号生成思路分析采用DFS,使用一个l和一个r表示当前使用的左括号和右括号的数量,如果r>l,表示该匹配不合理,那么return,代码class Solution {public: void DFS(vector<string>& cnt, string& ans, int l, int r, int n){ if(l == n && r == n){ cnt.push_back(ans);原创 2020-12-03 16:43:07 · 58 阅读 · 0 评论