算法复习之字符串(1)

(1)字符串循环左移 | 字符串全排列(递归,非递归)《本节内容》
(2)KMP算法| BF算法
(3 字符串的最长回文子串|BM算法| 字符串查找

串是有零个或者多个字符组成的有限序列,也叫字符串。电子词典查找单词就是字符串的典型应用

分清空格串和和空串;子串(子序列)和主串;串的顺序存储,链式存储;求串的长度;取第i个位置这些基础操作算法略过

一、字符串循环左移

问题:给定一个字符串S[0...N-1],要求把S的前k 个字符移动到S的尾部,如把字符串“abcdef” 前面的2个字符‘a’、‘b’移动到字符串的尾部,得到新字符串“cdefab”:即字符串循环左移k。

  • 当看到这个题目时候,必然想到暴力法,每次循环左移一位,调用K次,时间复杂度O(kN),空间复杂度O(1)

  • 三次拷贝
    S[0...k] → T[0...k]
    S[k+1...N-1] → S[0...N-k-1]
    T[0...k] →S[N-k...N-1]
    时间复杂度O(N),空间复杂度O(k)

  • 上面都过于粗鲁,学过线代的都知道这个转置,可能不太恰当,理解就好,时间复杂度O(N),空间复杂度O(1):
    如:abcdef
    X=ab X’=ba
    Y=cdef Y’=fedc
    (X’Y’)’=(bafedc)’=cdefab
    是不是很那个奇妙,算法就是要多想想,而不是死记硬背

    void ReverseString(char*,int from,int to){
      while(from < to){
          char t = s[from];
          s[from++] = s[to];
          s[to--] = t;
      }
    }
    void leftRotateString(char*, int n, int m){
          m %= n;
          ReverseString(s,0,m-1);
          ReverseString(s,m,n-1);
          ReverseString(s,0,n-1);
    
    }
    

二、字符串全排列

问题:给定字符串S[0...N-1],设计算法,枚举S的 全排列。

  • 递归
char[] = "1234";
int size = sizeof(str) / sizeof(char);
void Permutation(int from,int to){
    if(from==to){
        for(int i = 0;i <=to;i++){
            cout<<str[i];
        }
        cout<<'\n';
        return;
    }
    for(int i = from; i<=to;i++){
        swap(str[i],str[from]);
        Permutation(from+1,to);
        swap(str[i],str[from]);
    }
} 
int _tmain(int argc, _TCHAR* argv[]){
    Permutaiton(0,size-2);
    return 0;
}

带重复字符的全排列就是每个字符分别与它后面非重复出现的字符交换。即:第i个字符与第j个字符交换时,要求[i,j)中没有与第j个字符相等的数。
代码怎么写?其实在上面基础上加上简单判断一下就行

    for(int i = from; i<=to;i++){
     if(!IsSwap(from,1))
        continue;
    swap(str[i],str[from]);
    Permutation(from+1,to);
    swap(str[i],str[from]);
    }
} 

复杂度计算:
∵f(n) = nf(n-1) + n^2
∵f (n-1)=(n-1)
f(n-2) + (n-1)^2
∴f(n) = n((n-1)f(n-2) + (n-1)^2) + n^2
∵ f(n-2) = (n-2)f(n-3) + (n-2)^2
∴ f(n) = n
(n-1)((n-2)f(n-3) + (n-2)^2) + n(n-1)^2 + n^2
= n
(n-1)(n-2)f(n-3) + n(n-1)(n-2)^2 + n(n-1)^2 + n^2
=.......
< n! + n! + n! + n! + ... + n!
= (n+1)
n!
时间复杂度为O((n+1)!)
注:当n足够大时:n! > n+1

  • 非递归

步骤:后找、小大、交换、翻转——

后找:字符串中最后一个升序的位置i,即:S[k]>Sk+1,S[i]<S[i+1];
查找(小大):S[i+1...N-1]中比Ai大的最小值Sj;
交换:Si,Sj;
翻转:S[i+1...N-1]

代码就不再写了

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,444评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,421评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,363评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,460评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,502评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,511评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,280评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,736评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,014评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,190评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,848评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,531评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,159评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,411评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,067评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,078评论 2 352

推荐阅读更多精彩内容