思路:遍历字符串,将第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;
}
题目:反转字符串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;
}