![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
字符串
想名字多费事
编程小白入驻
展开
-
字符串相乘(大数相乘)
1、思路(字符串模拟) O(n*m)一、普通竖式以num1 = 123 , num2 = 456为例:我们遍历 num2 每一位与 num1 进行相乘,将每一步的结果进行累加,在这个过程如果相乘或者相加的结果大于等于10 ,我们都要去满10进位,如下图所示:这样模拟普通竖式计算的方法较为复杂,我们可以考虑优化版的竖式计算。二、优化竖式其实在相乘或者相加计算过程的每一位,我们可以考虑先不去满10进位,等到计算完所有的相乘结果以后,最终将其加到一块,再去满10进位 ,最后的结果和普通竖式 一样,但.原创 2021-09-26 17:36:38 · 406 阅读 · 0 评论 -
去除字符串空格
#include <iostream>#include <cstring>using namespace std;//遍历元字符串,删除空格char *remove_blank(char *str){ int index = 0; for(int ii=0;ii<strlen(str);ii++){ if(str[ii] != ' '){ str[index++] = str[ii]; }原创 2021-09-23 18:28:37 · 89 阅读 · 0 评论 -
返回“最大数”
思路:自定义排序 A+B >B+Aclass Solution {public: /* static bool cmp(string& a,string& b){ string c=a+b; string d=b+a; return c>d; } */ string largestNumber(vector<int>&.原创 2021-09-18 16:53:55 · 101 阅读 · 0 评论 -
402.移掉K位数字,使得剩下数字最小
思路这道题让我们从一个字符串数字中删除 k 个数字,使得剩下的数最小。也就说,我们要保持原来的数字的相对位置不变。以题目中的 num = 1432219, k = 3 为例,我们需要返回一个长度为 4 的字符串,问题在于: 我们怎么才能求出这四个位置依次是什么呢?这里有一个前置知识:对于两个数 123a456 和 123b456,如果 a > b, 那么数字 123a456 大于 数字 123b456,否则数字 123a456 小于等于数字 123b456。也就说,两个相同位数的数字大小关系.原创 2021-08-23 17:38:50 · 1295 阅读 · 1 评论 -
最小覆盖子串_滑动窗口
解题思路class Solution {public: string minWindow(string s, string t) { vector<int> need(128,0);//用need数组记录我们所需要的元素 for(char c : t){ need[c]++; } int needcount=t.size(); int ii=0,jj=0;//定义滑动窗口 s.原创 2021-08-21 14:10:40 · 87 阅读 · 0 评论 -
无重复字符的最长子串_滑动窗口
思路:这道题主要用到思路是:滑动窗口。其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!如何移动?我们只要把队列的左边的元素移出就行了(不断地缩小左边窗口),直到窗口中不存在与要入队的字符重复的字符为止。一直维持这样的队列,找出队列出现最长的长度时候,求出解!时间复杂度:O(n)// 滑动窗口// 每一时刻,窗口都表示一个无重复字符的子串class Soluti.原创 2021-08-21 11:54:03 · 89 阅读 · 0 评论 -
字母图形+递归函数
#include <bits/stdc++.h>using namespace std;int main(){ string s; cin>>s; int size=s.size(); for(int ii=1;ii<=size;ii++){ if(ii==1) cout<<s<<endl; else { reverse(s.begin(),s.be.原创 2021-05-13 21:41:02 · 105 阅读 · 0 评论 -
输出字母沙漏+对称字符串
#include <bits/stdc++.h>using namespace std;int main(){ int n; cin>>n; for (int i = 0; i < 2 * n + 1; i++) { //控制行数 for (int j = 0; j < 2 * (abs(n - i)) + 1; j++) {//控制每行总字母数 if (i <= n) { .原创 2021-05-12 22:06:32 · 214 阅读 · 0 评论 -
重复的子字符串
next 数组记录的就是最长相同前后缀的集合。如果 next[len - 1] != 0,则说明字符串有最长相同的前后缀(就是字符串里的前缀子串和后缀子串相同的最长长度)。next数组中最长相等前后缀的长度为:next[len - 1] 。数组长度为:len。如果len % (len - (next[len - 1])) == 0 ,则说明 (数组长度-最长相等前后缀的长度) 正好可以被 数组的长度整除,说明有该字符串有重复的子字符串。「强烈建议大家把next数组打印出来,看看next数组里的规.原创 2021-05-09 15:45:15 · 93 阅读 · 0 评论 -
实现strstr(****)
求next数组 void getNext(int* next,const string &s){ int j=0; next[0]=j; for(int i=1;i<s.size();i++){ while(j>0 && s[i]!=s[j]){ j=next[j-1]; } if(s[i]==s[j]){ j++; } next[i]=j; }}代码实现class S.原创 2021-05-09 10:44:01 · 60 阅读 · 1 评论 -
KMP算法原理
什么是KMP三位学者发明的:Knuth,Morris和Pratt算法KMP有什么用KMP主要应用在字符串匹配上。KMP的主要思想是「当出现字符串不匹配时,可以知道一部分之前已经匹配的文本内容,可以利用这些信息避免从头开始再去做匹配了。」那么如何记录已经匹配的文本内容,是KMP的重点,也是next数组肩负的重任。前缀表next数组就是一个前缀表(prefix table)。前缀表有什么作用呢?「前缀表是用来回溯的,意味着在某个字符失配时,前缀表会告诉你下一步匹配中,模式串应该跳到哪个位置。原创 2021-05-08 23:25:13 · 470 阅读 · 0 评论 -
左旋转字符串
上一题目字符串:翻转字符串里的单词中,使用整体反转+局部反转就可以实现反转单词顺序的目的。这道题目也非常类似,依然可以通过整体反转+局部翻转 达到左旋转的目的c++ 代码先整体翻转再局部翻转,当然也可以先局部在整体翻转。class Solution {public: string reverseLeftWords(string s, int n) { reverse(s.begin(),s.end()); reverse(s.begin(),s.end().原创 2021-05-08 19:53:48 · 49 阅读 · 0 评论 -
翻转字符串里面的单词(*****)
思路想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒叙了,那么再把单词反转一下,单词就正过来了。所以解题思路如下:1、移除多余空格2、将整个字符串反转3、将每个单词反转class Solution {public: // 反转字符串s中左闭又闭的区间[start, end] void reverse(string& s, int start, int end) { for (;start < end; star.原创 2021-05-07 20:57:47 · 67 阅读 · 0 评论 -
替换空格
遇到对字符串或者数组做填充或删除的操作时,都要想想从后向前操作怎么样。思路1、首先扩充数组到每个空格替换成"%20"之后的大小。2、定义双指针,ii指向旧长度的末尾,jj指向新长度的末尾。3、然后从后向前替换空格。为什么要从后向前填充,从前向后填充不行么?从前向后填充就是O(n^2)的算法了,因为每次添加元素都要将添加元素之后的所有元素向后移动。「其实很多数组填充类的问题,都可以先预先给数组扩容带填充后的大小,然后在从后向前进行操作。」这么做有两个好处:不用申请新数组。从后向前填充元素.原创 2021-05-07 15:33:31 · 98 阅读 · 0 评论 -
反转字符串II
双指针法class Solution {public: string reverseStr(string s, int k) { int n = s.size(); int start = 0, end = n - 1; while(start < n) { if(start + 2 * k < n) { //剩余的字符>=2*k个,则一定可以找到下一段起点. revers.原创 2021-05-07 10:44:19 · 119 阅读 · 0 评论 -
反转字符串
双指针法class Solution {public: void reverseString(vector<char>& s) { int size=s.size(); //if(size==1) return; int left=0,right=size-1; //for(int ii=0;ii<size;ii++){ while(left<right){ .原创 2021-05-06 20:42:58 · 53 阅读 · 0 评论