LC 344 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
for(int i=0,j=s.size()-1;i<j;i++,j--){
swap(s[i], s[j]);
}
}
};
LC 541 反转字符串 II
class Solution {
public:
string reverseStr(string s, int k) {
for(int i =0;i<s.size(); i+=2*k){
if(i+k<=s.size()){
reverse(s.begin()+i, s.begin()+i+k);
}else{
reverse(s.begin()+i, s.end());
}
}
return s;
}
};
class Solution {
public:
string replaceSpace(string s) {
int cnt = 0;
for(int i=0;i<s.size();i++){
if(s[i]==' ') cnt++;
}
int old_size = s.size();
s.resize(s.size()+2*cnt);
for(int i=s.size()-1,j=old_size-1; j>=0; i--,j--){
if(s[j]!=' '){
s[i] = s[j];
}else{
s[i] = '0';
s[i-1] = '2';
s[i-2] = '%';
i -= 2;
}
if(i==j && s[j]!=' ') break;
}
return s;
}
};
LC 151 反转字符串中的单词
class Solution {
public:
string reverseWords(string s) {
//删除多余空格
int fast=0, slow=0;
for(;fast<s.size(); fast++){
if(s[fast]==' ' && (slow==0 || s[fast-1]==' ')){
continue;
}else{
s[slow] = s[fast];
slow++;
}
}
//结尾可能剩下一个空格
if(s[--fast]==' '){
slow--;
}
s.resize(slow);
reverse(s.begin(), s.end());
int last = 0;
for(int next=0; next<s.size();next++){
if(s[next]==' '){
reverse(s.begin()+last, s.begin()+next);
last = next+1;
}
}
reverse(s.begin()+last, s.end());
return s;
}
};
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(), s.begin()+n);
reverse(s.begin()+n, s.end());
reverse(s.begin(), s.end());
return s;
}
};
LC 28 找出字符串中第一个匹配项的下标
(KMP)
next数组写得不好,应该先while, 再一起if,下次改
class Solution {
public:
int strStr(string haystack, string needle) {
int last[needle.size()];
for(int i=0, j=0; j<needle.size(); j++){
if(j==0){
last[j]=-1;
}else if(needle[i]==needle[j]){
last[j] = last[j-1] + 1;
i++;
}else{
while(i>=1 && needle[j]!=needle[i]){
i = last[i-1] + 1;
}
// cout<<j<<' '<<i<<endl;
if(needle[i]==needle[j]){
last[j] = i;
i++;
}else{
last[j] = -1;
i=0;
}
}
}
int k=-1;
for(int i=0;i<haystack.size(); i++){
while(k>-1&&haystack[i]!=needle[k+1]){
k=last[k];
}
if(haystack[i]==needle[k+1]){
k++;
if(k==needle.size()-1){
return i-needle.size()+1;
}
}
}
return -1;
}
};
LC 459 重复的子字符串
(没验证这个方法的正确性)
另一种方法是在(s+s)[1:-1]中查找s
class Solution {
public:
bool repeatedSubstringPattern(string s) {
int last[s.size()];
for(int i=0, j=0; j<s.size(); j++){
while(i>=1 && s[j]!=s[i]){
i = last[i-1] + 1;
}
if(j==0){
last[j]=-1;
}else if(s[i]==s[j]){
last[j] = i;
i++;
}else{
last[j] = -1;
i=0;
}
}
return last[s.size()-1]>=0 && !(s.size()%(s.size() - last[s.size()-1] -1)) ;
}
};