目录
344. 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int left =0,right = s.size()-1;
char tmp;
while(left<right){
tmp = s[left];
s[left++] = s[right];
s[right--] = tmp;
}
}
};
541. 反转字符串II
class Solution {
public:
void reverseK(int left, int right, string& s){
if (right>s.size()-1) right = s.size()-1;
char tmp;
while(left<right){
tmp = s[left];
s[left++] = s[right];
s[right--] = tmp;
}
}
string reverseStr(string s, int k) {
for (int ii = 0;ii<s.size();ii+=2*k){
reverseK(ii,ii+k-1,s);
}
return s;
}
};
剑指Offer 05.替换空格
class Solution {
public:
string replaceSpace(string s) {
int count = 0 ;
for (auto c:s){
if(c ==' ')count++;
}
if (count==0)return s;
int left = s.size(),right = left+2*count;
s.resize(right);
while(left>-1){
if(s[left]!=' '){
s[right--] = s[left--];
}
else{
s[right--] = '0';
s[right--] = '2';
s[right--] = '%';
left--;
}
}
return s;
}
};
151.翻转字符串里的单词
class Solution {
public:
void reversePart(string &s,int left,int right){
char tmp;
while(left<right){
tmp = s[left];
s[left++] = s[right];
s[right--] = tmp;
}
}
void adjust(string &s){
int left = 0,right = 0,l = s.size();
while(right<l && s[right++]==' '){}
while(right<l){
if (s[right]!=' '){
s[left++] = s[right++];
if(right<l-1 && s[right] = ' '){
s[left++] = ' ';
}
}
else{
right++;
}
}
s.resize(left);
}
string reverseWords(string s) {
int l = s.size();
reversePart(s,0,l-1);
adjust(s);
int left = 0,right = 0;
while(right<=l){
if(s[right]==' '||right ==l){
reversePart(s,left,right-1);
left = right+1;
}
right++;
}
return s;
}
};
剑指Offer58-II.左旋转字符串
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;
}
};
28. 实现 strStr()
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
left = 0
right = 0
n = len(haystack)
t = len(needle)
tmp = self.getBack(needle)
while (left<n):
if (haystack[left]==needle[right]):
left+=1
right+=1
if (right==t):return left-t
else:
if (right==0):left+=1
else:
right = tmp[right-1]
return -1
def getBack(self,needle):
t = len(needle)
tmp = [0]*t
left = 0
right = 1
while(right<t):
if (needle[left]==needle[right]):
tmp[right] = left+1
left+=1
right+=1
else:
while(left>0 and needle[left]!=needle[right]):
left = tmp[left-1]
if (left==0 and needle[left]!=needle[right]):
tmp[right] = 0
right+=1
return tmp
class Solution {
public:
void getBack(string needle,int tmp[],int t){
int left = 0,right = 1;
tmp[0] = 0;
while(right<t){
if (needle[left]==needle[right]){
left++;
tmp[right++] = left;
}else{
if(left ==0)tmp[right++] = 0;
else left = tmp[left-1];
}
}
}
int strStr(string haystack, string needle) {
int n = haystack.size(),t = needle.size(),left = 0,right = 0;
int tmp[t];
getBack(needle,tmp,t);
while(left<n){
if (haystack[left]==needle[right]){
left++;
right++;
if(right==t)return left-t;
}else{
if(right==0)left++;
else right = tmp[right-1];
}
}
return -1;
}
};