序列自动机
介紹
子串:串中任意個連續的字符組成的子序列稱為該串的子串
子序列:子序列中的字符在字符串中不一定是連在一起的,而是刪除其中若干個, 但子序列一定是單調的
簡單說就是子序列不連續,子串連續
序列自動機可以在復雜度為O(n)下判斷一個串是不是另一個串的子序列
序列自動機的本質其實就是空間換時間,因為暴力做完全也是可以的,但是會超時,dp做的話還容易超空間
所需數組:
next[i][j] :j的范圍為(0~25)即對應26個英文字母。表示原串s的第i位后面那26個字母j出現的最早的位置
也就是next指向的是下一個j的坐標,這樣的話把next的值帶入下一個next[i][j]中的j,就可以一直向下找
你可以理解成建了一棵樹,一直向外伸長樹枝,相連在一起
那如何建樹呢?
next存的是最早出現的字符,我們可以倒著建,將后面的賦給前面
我們用next[i+1][j]賦給next[i][j],找到第i個字符后面的26個字母最早出現的位置
next[i][s[i]-‘a’]=i
然后把當前字符更新到當前字符在原串中從后向前最晚出現的位置
查找時可以這樣:
int now = nxt[i][mark[pos++] - 'a'];while (now != -1 && pos < 10) {now = nxt[now][mark[pos++] - 'a'];}例題:
例題
總結
- 上一篇: 1559 元再探底:森海塞尔 MOMEN
- 下一篇: 拼凑 牛客练习赛70