【数据结构与算法】(十二)字符串匹配
KMP算法
失效数组 next 数组储存的是最长可匹配前缀子串结尾字符下标,进一步理解,比如next[2]=aba aba的最长可匹配前缀是a 所以next[2]=0
KMP算法框架:
// a, b 分别是主串和模式串;n, m 分别是主串和模式串的长度。 public static int kmp(char[] a, int n, char[] b, int m) { int[] next = getNexts(b, m); int j = 0; for (int i = 0; i < n; ++i) { while (j > 0 && a[i] != b[j]) { // 一直找到 a[i] 和 b[j] j = next[j - 1] + 1; //j=next(k-1)+1 j代表坏字符,遇到坏字符,更新j,向后移动next(k-1) } if (a[i] == b[j]) { ++j; } if (j == m) { // 找到匹配模式串的了 return i - m + 1; } } return -1; }
Trie树 数组下标= ASCII-'a' 插入和查询
AC自动机 多模式串匹配算法
LeetCode:
1 翻转字符串里的单词
string 插入和删除char (类似于vector函数)
str.push_back(char) str.pop_back(char)
string 查找find
str.find() str.find_first_of(char,pos) str.find_first_not_of(char, pos)
处理数字问题时,对于特别大的数会溢出,不要用int,使用long long
字符转数字 使用num=10*num_pre+item