算法:字符串问题

问题A:
字符串正则匹配:

见:https://blog.csdn.net/ShellDawn/article/details/90258896


问题B:
旋转字符串判断:

将字符串前面任意部分挪到后面形成新字符串,则新旧字符串互为旋转字符串。

思维+KMP,时间O(N)
将某一字符串变为2倍长,首尾拼接,则旋转字符串一定在其之间。


问题C:
AC自动机。

见:https://blog.csdn.net/ShellDawn/article/details/88846272


问题D:
字符串旋转,要求空间复杂度为O(1)

思维,时间O(N)
例如:ABCDE -> DEABC

步骤如下:ABCDE -> CBADE -> CBAED -> DEABC

或者,二分思想:
例如:1234567ABCD -> ABCD1234567

每次选取较短部分进行交换。
步骤如下:1234567ABCD -> ABCD5671234 -> ABCD2341567 -> ABCD1342567 -> ABCD1243567 -> ABCD1234567


问题E:
完美洗牌问题,空间要求O(1)

将 {L1,L2,L3,R1,R2,R3} -> {R1,L1,R2,L2,R3,L3}

思维,下标连续推,时间O(N)

长度2*N的数组,可以由数个(3^ka-1), (3 ^kb -1)…长度的子数组组成。

长度为3^k -1 的数组有规律,通过下标连续推可以形成数个环,每个环的起始位置为1,3,9,…,3 ^(k-1)。


问题F:
将一个数组调整成{a,b,c,d,e} 使之满足 a<=b>=c<=d>=e,要求空间O(1)

思维,时间O(N*logN)

先将数组排序,然后构造{L1,R1,L2,R2…}即可。
注,完美洗牌问题只能构造{R1,L1,R2…},所以使用完美洗牌后,再将相邻两个交换,例如L1和R1。


问题G:

旋变字符串:
每个字符都作为叶结构可以构成一棵树,拥有公共父节点都串可以左右交换,称为旋变字符串,判断两个串是否互为旋变字符串。

dp,时间O(NNN*N)
dp[i][j][k] 代表strA[i…i+k] 和 strB[j…j+k] 是否为旋变串。
dp[0][0][N]即为所求答案。

dp填一个四棱锥,高为K,长宽各为i和j
每个点依赖平行于i面和j面的斜线。

故而,四重循环最外层从下向上,内两层铺i*j的面,最内层枚举k。


问题H:
最大回文子串的Manacher算法,见https://blog.csdn.net/ShellDawn/article/details/90579477

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值