C++程序 在常数时间内查询给定字符串的旋转和第K个字符
在编写字符串处理程序时,常常需要查询字符串的旋转和某个位置上的字符。本文将介绍如何在常数时间内完成这些操作,并给出相应的C++程序。
旋转字符串
旋转字符串是将字符串的前若干个字符移动到字符串末尾形成的新字符串。例如,将字符串“abcdefg”旋转两个字符之后得到的新字符串为“cdefgab”。
思路:可以先将原字符串的前k个字符翻转,再将剩余的字符翻转,最后将整个字符串翻转即可得到旋转后的字符串。
举个例子,如下是实现上述思路的C++代码:
string rotateString(string s, int k) {
int n = s.length();
k %= n;
reverse(s.begin(), s.begin() + k);
reverse(s.begin() + k, s.end());
reverse(s.begin(), s.end());
return s;
}
代码分析:
- 首先判断k是否大于字符串长度,如果是,则用k对字符串长度取余。
- 将前k个字符翻转,可以使用STL库中的
reverse
函数,其中第一个参数为翻转的字符串范围的起始位置,第二个参数为结束位置(不包括)。 - 将剩余的字符翻转。
- 最后将整个字符串翻转即可。
查询第K个字符
查询字符串中的第K个字符也是常见的操作。在字符串中,字符的位置从0开始计算。
思路:C++语言中,字符串可以看成是一个字符数组,可以通过下标访问其中的元素。因此,可以直接返回字符串中第K个字符即可。
举个例子,如下是实现上述思路的C++代码:
char findKthChar(string s, int k) {
return s[k];
}
完整的C++程序
综合上述两个操作,可以得到以下完整的C++程序:
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
string rotateString(string s, int k) {
int n = s.length();
k %= n;
reverse(s.begin(), s.begin() + k);
reverse(s.begin() + k, s.end());
reverse(s.begin(), s.end());
return s;
}
char findKthChar(string s, int k) {
return s[k];
}
int main() {
string s = "abcdefg";
int k = 2;
string rotated = rotateString(s, k);
char kthChar = findKthChar(rotated, k);
cout << "Rotated string: " << rotated << endl;
cout << "Kth character: " << kthChar << endl;
return 0;
}
结论
本文介绍了在常数时间内完成查询字符串的旋转和第K个字符的操作,给出了C++程序实现,并分析了实现思路和代码逻辑。在实际编程中,可以根据需要对代码进行修改和优化。