字符串相关题_python版
最长无重复字符子串长度
题目:给定一个字符串,请找出其中无重复字符的最长子字符串。例如,在”abcabcbb”中,其无重复字符的最长子字符串是”abc”,其长度为 3。
思路:遍历字符串中的每一个元素。借助一个辅助键值对来存储某个元素最后一次出现的下标。用一个整形变量存储当前无重复字符的子串开始的下标。
1 | # 分析 a b c d e f g d 此时从最近重复的前一个字符d的后一位开始记,即e标记为start。此时继续取下一个数, 例如a,它的前一个字符下标为d[s[i]]=0,若d[s[i]]<start,则不需要更新start,否则更新start。新的无重复子串变为e f g d a |
最长回文字符串
思路一:中心扩展法。根据回文的特性,显然所有的回文串都是对称的。长度为奇数回文串以最中间字符的位置为对称轴左右对称,而长度为偶数的回文串的对称轴在中间两个字符之间的空隙。可否利用这种对称性来提高算法效率呢?答案是肯定的。我们知道整个字符串中的所有字符,以及字符间的空隙,都可能是某个回文子串的对称轴位置。可以遍历这些位置,在每个位置上同时向左和向右扩展,直到左右两边的字符不同,或者达到边界。对于一个长度为n的字符串,这样的位置一共有n+n-1=2n-1个 ,时间复杂度O(n^2)
1 | class Solution(object): |
思路二:马拉车算法
KMP算法
其实就是,对模式串p进行预处理,得到前后缀的部分匹配表,使得我们可以借助已知信息,算出可以右移多少位.即 kmp = 朴素匹配 + 移动多位.
1 | #KMP |
字符串去重
1 | string = 'abc123456ab2s'r = ''.join(x for i, x in enumerate(string) if string.index(x) == i) |
统计一个字符串中英文字母、空格、数字的个数
1 | #!/usr/bin/python |