循环右移字符串简易探讨

来源:互联网 发布:在线提醒软件 编辑:程序博客网 时间:2024/06/07 05:41
#include <iostream>#include <cstdlib>#include <string>#include <queue>using namespace std;/* *设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)*//* * 方案一:将数组以队列存储,循环右移k位,相当于循环左移N-K位 * 对于队列而言,循环左移一位,相当于取出队头元素然后插入队尾*/class Solution {private:string str;     // 源字符串,由键盘输入string result;  // 转换后的字符串queue<char>q;   // 辅助队列public:Solution() {cin>>str;string::iterator it;/* * 将输入字符串转换为队列*/for(it = str.begin();it!= str.end();it++) {q.push(*it);   // 将元素插入队尾}}void JustDoIt(int k) {int i;char t;int n = q.size();  // 取出队列元素个数/* * 参数判断*/if(k < 0) {cerr<<"参数错误!"<<endl;exit(1);}/* * 当k > N时,循环右移K位,相当与循环右移K%N位*/k %= n;for(i = 1;i <= n - k;i++) {t = q.front(); // 取出对头元素 q.pop();       // 弹出对头元素(队列头部出,尾部进)  q.push(t);}/* * 生成结果字符串*/for(i = 1;i <= n;i++) {t = q.front();q.pop();result += t;}}void show() const {cout<<result<<endl;}};void main() {Solution s;s.JustDoIt(4);s.show();}


#include <iostream>#include <cstdlib>#include <string>#include <queue>using namespace std;/* *设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N)*//* * 方案二:将数组以字符串存储,使用转置法解决 * 假设字符串为XY,Y是要循环右移的子串,移动后结果应该是YX * 那么 (YX) = (XTYT)T*/class Solution {private:string str;     // 源字符串,由键盘输入string result;  // 转换后的字符串public:Solution() {cin>>str;}/* * 逆转从指针i到指针j的字符串s*/void swap(string &s, int i, int j) {char t;while(i < j) {t = s[i];s[i] = s[j];s[j] = t;i++;j--;}}void JustDoIt(int k) {int n = str.size();/* * 参数判断*/if(k < 0) {cerr<<"参数错误!"<<endl;exit(1);}/* * 当k > N时,循环右移K位,相当与循环右移K%N位*/k %= n;result = str;swap(result, 0, n - k - 1);swap(result, n - k, n -1);swap(result, 0, n - 1);}void show() const {cout<<result<<endl;}};void main() {Solution s;s.JustDoIt(4);s.show();}

测试:



原创粉丝点击