给定一个长度为n的字符串,然后将其向左移动m位。例如字符串“abcdef” 左移2位,则变成了“cdefab”
第一种方法:直接移动(暴力)
首先对字符串进行一位移动,如果移动m位,则循环m次,代码如下所示,时间复杂度O(m*n)
void shiftone(string &s , int m ) { while(m--) { char t = s[0]; int len = s.size(); for ( int i = 1 ; i < len ; ++i) s[i-1] = s[i]; s[len-1] = t ; } }
第二种方法:三次反转
abcdef 如果想要移动三位 则变成 defabc
首先 对abc 反转 则变成了 cba 然后对def 变成了fed 则字符串变成 cbafed 再 对整体反转 变成了defabc
void reverse(string &s , int lo , int hi) { while( lo < hi ) { char t = s[lo] ; s[lo++] = s[hi] ; s[hi--] = t ; } } void leftshift(string &s , int m) { int len = s.size() ; if ( len > m ) { reverse(s,0,m-1); reverse(s,m,len-1); reverse(s,0,len-1) ; } }