反转字符串
思路:遍历字符串,将第i个字符和第N-i-1个字符串交换即可;
代码实现:
#include <iostream>
#include <string>
using namespace std;// 反转字符串
string reserveString(string str)
{if (str.size() == 0 || str.size() == 1){return str;}string res = str;// 使用双指针交换指向的数值int left = 0;int right = str.size() - 1;while (left < right){char temp = res[left];res[left] = res[right];res[right] = temp;right--;left++;}return res;
}
int main()
{// 反转字符串string s = "hello world!";string r = reserveString(s);cout << r << endl;return 0;
}
K组反转字符串
题目:反转字符串2
思路:每2k个一组,将其前k个字符反转,使用i+k与字符串长度n判断剩余字符串长度属于(0,k)还是 [k,2k)之间;然后按照要求剩余字符串即可;
代码实现:
#include <iostream>
#include <string>
using namespace std;void reverse(string &s, int left, int right)
{while (left < right){char temp = s[left];s[left] = s[right];s[right] = temp;right--;left++;}
}
// K组一个反转字符串
void resverseKString(string &s, int k)
{for (int i = 0; i < s.size(); i += 2 * k){int left = i;int right;if (i + k <= s.size()){// 剩余字符个数在[k,2k)之间right = i + k - 1;}else if (i + k > s.size()){// 剩余字符个数小于k个right = s.size() - 1;}reverse(s, left, right);}
}int main()
{//K组反转字符string s1 = "abcdefg";resverseKString(s1,2);cout << s1 << endl;return 0;
}
仅反转字符串中的字母
题目:仅仅反转字母
思路:
1、定义左右指针分别指向字符串字符串的头部和尾部;
2、持续向右移动左指针,直到找到第一个字母;
3、持续向左移动右指针,直到找到第一个字母;
4、交换左右指针指向的字符;
5、循环1,2,3 步骤,直到左指针大于等于右指针;
代码实现:
#include <iostream>
#include <string>
using namespace std;
//仅仅反转字母
void reverseChar(string &s)
{int left = 0;int right = s.size()-1;while(left < right){while(!isalpha(s[left]))//isalpha()函数判断当前字符是否是字母{left++;}while(!isalpha(s[right])){right--;}char temp = s[left];s[left] = s[right];s[right] = temp;right--;left++;}
}
int main()
{//仅仅反转字母string s2 = "a-bC-dEf-ghIj";reverseChar(s2);cout << s2 << endl;return 0;
}
验证回文字符串
题目:验证回文字符串
思路:
1、将字符串中字母和数字取出组成待判断的字符串,由于不区分大小写,因此将遇到的字母全部转换为大写/小写;
2、定义左右指针分别指向字符串字符串的头部和尾部;
3、判断左右指针指向的字符是否相等,如果相等,移动指针继续判断;如果不相等,不是回文字符串,直接返回false;
代码实现:
#include <iostream>
#include <string>
using namespace std;
//验证回文字符串
bool isPalidrome(string s)
{bool res = true;//统计字符串中的所有字母数字 不区分大小写,所以将所有字母保存为小写string str = "";for(auto a : s){if(isalnum(a)){str += tolower(a);}}int left = 0;int right = str.size()-1;while(left < right){if(str[left] != str[right]){res = false;return res;}left++;right--;}return res;
}
int main()
{//验证回文字符串string s3 = "A man,a plan, a canal, Panama";bool r3 = isPalidrome(s3);cout << r3 << endl;return 0;
}