滑窗算法python实现返回最长字符子串
时间: 2023-07-31 20:09:04 浏览: 136
下面是使用滑动窗口算法实现返回最长字符子串的Python代码:
```
def longest_substring(s):
n = len(s)
i = j = 0
max_len = 0
sub_str = ''
set_s = set()
while i < n and j < n:
if s[j] not in set_s:
set_s.add(s[j])
j += 1
if j - i > max_len:
max_len = j - i
sub_str = s[i:j]
else:
set_s.remove(s[i])
i += 1
return sub_str
```
该函数接受一个字符串作为输入,返回这个字符串中最长的不重复的连续子串。
具体实现过程为,在一个窗口内使用两个指针i和j,i指向窗口的左端,j指向窗口的右端。同时维护一个集合set_s,用于存储窗口内的字符。如果当前字符不在set_s中,将其加入set_s,同时将窗口右移一位,并更新最长子串的长度和内容;如果当前字符已经在set_s中,将窗口左移一位,并将set_s中对应的字符删除。
该算法的时间复杂度为O(n),其中n为字符串的长度,空间复杂度为O(min(m,n)),其中m为字符集的大小。
相关问题
Python查找最长回文子串
在Python中,找出字符串中最长的回文子串可以使用动态规划(Dynamic Programming)的方法。一种常见的解决方案是Manacher's Algorithm,它是一种高效的算法,可以在O(n)的时间复杂度内解决这个问题。以下是基本的步骤:
1. 首先,对原始字符串进行预处理,每个字符之间插入特殊字符(如'#'),例如将"abcba"变为"#a#b#c#b#a#",目的是为了处理奇数长度和偶数长度的回文。
2. 定义两个数组P,记录已计算出的回文半径。P[i]表示以i为中心的最长回文串的半径。
3. 初始化两个变量,中心点c和最右边边界r,初始值都为0。然后遍历整个预处理后的字符串。
4. 对于每个位置i,通过比较左右两侧已经确定的回文半径,更新P[i]。如果i在r的范围内,则P[i]取c到i之间的回文半径的最小值减去2*i-r;否则,P[i]等于1。
5. 如果i + P[i] > r,说明找到了新的回文中心,更新c和r。
6. 最后,在P数组中找到最大值,其对应的索引即为最长回文串的起始位置,最长回文串的长度就是2*P[最长回文起始索引]。
下面是一个简单的Python函数示例:
```python
def longest_palindrome(s):
if not s:
return ""
# Preprocessing string with '#' separator
s = '#'.join('^{}$'.format(s))
n = len(s)
P = [0] * n
center, right = 0, 0
for i in range(1, n - 1):
if i < right:
P[i] = min(right - i, P[2 * center - i])
while (i - P[i] - 1 >= 0 and i + P[i] + 1 < n and s[i - P[i] - 1] == s[i + P[i] + 1]):
P[i] += 1
if i + P[i] > right:
center, right = i, i + P[i]
max_len = max(P)
start_index = P.index(max_len)
end_index = start_index + max_len * 2
return s[start_index:end_index].replace('#', '')
```
python求两个字符串的最长公共子串
你好,关于你的问题,我可以回答。求两个字符串的最长公共子串可以使用动态规划算法。具体步骤是:先构造一个二维数组,行数为第一个字符串的长度,列数为第二个字符串的长度。然后,遍历数组,如果两个字符串的某个字符相同,就将该位置的值设为左上角位置的值加一,否则设为零。最后,找到数组中的最大值,该值所在的位置就是最长公共子串的末尾位置,根据该位置和最大值可以求出最长公共子串。希望能帮到你。
阅读全文