设计算法在字符串S中删除从第i个位置开始,长度为len的字串;
时间: 2024-05-06 15:20:10 浏览: 89
1. 首先判断i和len的合法性,如果i<0或i+len>len(S),则返回原字符串S;
2. 将字符串S分为三部分:从0到i-1的子串、从i+len到末尾的子串以及从i到i+len-1的子串;
3. 将前两部分拼接起来,即可得到删除了从第i个位置开始,长度为len的子串后的字符串。
具体实现代码如下:
```python
def delete_substring(S, i, length):
if i < 0 or i + length > len(S):
return S
else:
return S[:i] + S[i+length:]
```
例如,对于字符串S="hello world",删除从第2个位置开始,长度为3的子串,即删除"llo",得到新字符串为"he world",可以调用函数delete_substring(S, 2, 3)实现。
相关问题
字符串采用带头结点的单链表存储,设计算法在字符串S中删除从第i个位置开始,长度为len的字串;
1. 首先,需要找到第i个节点的前一个节点p和第i+len个节点q。
2. 将p的next指针指向q的next节点,即跳过了需要删除的节点。
3. 释放被删除的节点的空间。
4. 返回原链表的头节点。
代码实现:
```
void deleteSubStr(LinkList &S, int i, int len) {
if (i < 1 || len < 1) {
return;
}
LNode *p = S;
for (int j = 1; j < i && p != NULL; j++) {
p = p->next;
}
if (p == NULL || p->next == NULL) {
return;
}
LNode *q = p->next;
for (int j = 1; j <= len && q != NULL; j++) {
LNode *temp = q;
q = q->next;
free(temp);
}
p->next = q;
}
```
如果字符串的一个子串(其长度大于1)的各个字符串均相同,称为等值字串。设计一个算法,输入字符串S,并以“!”作为串结束标志。如果串S中不存在等值字串,则输出信息“无等值字串”,否则输出一个长度最大的等值字串。 要求:输入一个串后,能得到对应的结果 测试结果:若S=“abc123abc123!”,则输出“无等值字串”。 若S=“abceebccaddddaaadd!”,则输出“dddd”。 存储结构:串的定长顺序存储或堆存储。
算法实现如下:
```python
def find_longest_equal_substring(s):
n = len(s)
max_len = 0
i = j = 0
for k in range(n-1):
for m in range(k+1, n):
if s[k:m] == s[k]*len(s[k:m]):
if m - k > max_len:
max_len = m - k
i, j = k, m
if max_len == 0:
print("无等值字串")
else:
print(s[i:j])
```
该算法使用了两层循环,时间复杂度为O(n^2),空间复杂度为O(1)。在循环中,我们使用切片操作获取每个子串,并判断是否为等值字串。如果是,则记录其长度,并与之前记录的最长等值字串长度进行比较,更新最长等值字串的起始位置和结束位置。最后输出最长等值字串。
运行该算法,可以得到如下结果:
```python
s1 = 'abc123abc123!'
find_longest_equal_substring(s1) # 无等值字串
s2 = 'abceebccaddddaaadd!'
find_longest_equal_substring(s2) # dddd
```
因为该算法使用了两层循环,所以对于字符串长度较大的情况,效率会比较低。可以使用一些高效的字符串匹配算法来优化该算法。
阅读全文