题目及链接:
344.反转字符串
太简单就不写了
541.反转字符串||
题意:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
做题状态:
怎么就没想到用min呢,while 和if弄了半天
题解:
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
return s;
}
};
卡码网54.替换数字
有点简单了
#include<bits/stdc++.h>
using namespace std;
int main(){
string st,str="";
cin>>st;
for(auto ch:st){
if(isdigit(ch)){
str+="number";
}
else str+=ch;
}
cout<<str;
return 0;
}
151.翻转字符串里的单词
题意:
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
输入:s = " the sky is blue "
输出:"blue is sky the"
做题状态:
感觉很简单但就是做不出来
题解:
来自小虎的优美简介代码(个人感觉比官方写的好):
class Solution {
public:
string reverseWords(string s) {
int i = s.size() - 1;
string ans;
while(i >= 0)
{
int c = 0;
while(i >= 0 && s[i] == ' ') --i;
while(i >= 0 && s[i] != ' ')
{
--i;
++c;
}
if(c)
ans += s.substr(i+1, c) + " ";
}
return ans.substr(0, ans.size()-1);
}
};
总结:
做题不要着急,不要一上来就开始写,先想一想易错点,代码的思路啥的
str.substr(pos,len);返回pos开始的len长的字符串
卡码网55.右旋字符串
题意:
输入整数k和字符串str,将str的后k个置于str的前面
输入示例
2
abcdefg
输出示例
fgabcde
做题状态:
用了两个substr,一分钟不到过了
题解:
1.substr
#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
string str;
cin>>k>>str;
int n=str.length();
string s=str.substr(n-k,k);
s+=str.substr(0,n-k);
cout<<s;
return 0;
}
2.reverse
其实跟189.轮转数组几乎是一个题,唯一不同在于189题的K可能会比n大,所以要取模
整体反转再分别反转,积累一下这种思路
code(from 代码随想录)
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n;
string s;
cin >> n;
cin >> s;
int len = s.size(); //获取长度
reverse(s.begin(), s.end()); // 整体反转
reverse(s.begin(), s.begin() + n); // 先反转前一段,长度n
reverse(s.begin() + n, s.end()); // 再反转后一段
cout << s << endl;
}
28.找出字符串中第一个匹配项的下标
题意:
给两个字符串,找第二个在第一个里面出现的下标,没出现返回-1
做题状态:
不是,这题有点简单的过头咯,find一行秒
题解:
class Solution {
public:
int strStr(string haystack, string needle) {
return haystack.find(needle);
}
};
459.重复的子字符串
题意:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
做题状态:
用暴力做的,感觉做起来很别扭,看题解前没有找到简单的方法
题解:
(form随想录)
1.移动匹配
如果s满足条件,例如为abcabc,那么s+s=abcabcabcabc
那么中间必然出现s,所以删除首尾各一个字符后进行查找即可
class Solution {
public:
bool repeatedSubstringPattern(string s) {
string t = s + s;
t.erase(t.begin()); t.erase(t.end() - 1); // 掐头去尾
if (t.find(s) != std::string::npos) return true; // r
return false;
}
};
2.KMP算法
不会点这里看卡哥的视频
class Solution {
public:
void getNext (int* next, const string& s){
next[0] = -1;
int j = -1;
for(int i = 1;i < s.size(); i++){
while(j >= 0 && s[i] != s[j + 1]) {
j = next[j];
}
if(s[i] == s[j + 1]) {
j++;
}
next[i] = j;
}
}
bool repeatedSubstringPattern (string s) {
if (s.size() == 0) {
return false;
}
int next[s.size()];
getNext(next, s);
int len = s.size();
if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0) {
return true;
}
return false;
}
};
总结反思:
几乎都做过,所以今天还挺轻松的,就复习了一下半个月前学的kmp算法,当时·就学了个理论,现在用在题目上了(๑•̀ㅂ•́)و✧
标签:string,int,反转,训练营,随想录,day04,str,字符串,next From: https://blog.csdn.net/2301_79918816/article/details/140923598