若s采用的是单链结构存储的串,编写一个算法将其中所有的心字符替换成有y字符
假设单链表的定义如下:
typedef struct node{
char data;
struct node *next;
}Node, *LinkStrNode;
替换算法的实现如下:
void replaceChar(LinkStrNode &s)
{
LinkStrNode p = s->next; //从第一个节点开始遍历
while (p != NULL) {
if (p->data == 'x') {
p->data = 'y';
}
p = p->next;
}
}
s为单链表的头节点指针,算法中遍历链表的过程中,若当前节点的字符为'x',则将其替换为'y'。
比如 ,因为
比如 ,因为
所以
显而易见,最长回文字串的长度就是max(Len)-1!最长回文字串的中点就在max(Len)所在位置!
从这里就能看出添加“#”的另一个好处:
无论什么情况,一个回文字串都可以以“从中心点发散”的形式表示,这样就能对应到s中的每个点!
不添加“#”,在遇到偶数回文串的时候就没法从中心点发散,比如 。
我会解决该问题。这里提供一种基于递归的解决方案:
class Solution:
def replace_list(self, head, target, replacement):
# 定义递归函数replace_node,接收参数为当前节点和替换目标
def replace_node(node, target):
# 如果当前节点为空,则递归终止,返回None
if not node:
return None
# 如果当前节点的值等于替换目标,则将其替换为指定的replacement字符
if node.val == target:
node.val = replacement
# 继续递归左右子节点
node.next = replace_node(node.next, target)
# 返回当前节点
return node
# 调用递归函数,返回头节点(因为第一个节点可能会被替换)
return replace_node(head, target)
该算法中,先定义了一个内部递归函数replace_node
,接收两个参数,分别为当前节点和替换目标。该函数首先判断当前节点是否为空,如果为空则递归结束,返回None。
如果当前节点不为空,判断其值是否等于替换目标,如果相等则将其值修改为指定的replacement字符。然后继续递归处理左右子节点,最后返回当前节点。在递归过程中,如果当前节点被替换了,那么头节点可能会发生变化,因此最后返回调用递归函数后得到的头节点即可。
针对链式串的操作,链表是一种比较适合的数据结构。在这里,我们默认输入的字符串已经被转化为了单链表的形式。如果还没有转化为单链表,可以先将其转为链表,再调用上述算法进行字符替换操作。
下面给出一个用于将字符串转化为单链表的函数,方便参考:
class ListNode:
def __init__(self, val):
self.val = val
self.next = None
def stringToListNode(input):
# Generate list from the input
numbers = input
dummyRoot = ListNode(0)
ptr = dummyRoot
for number in numbers:
ptr.next = ListNode(number)
ptr = ptr.next
ptr = dummyRoot.next
return ptr
该函数接收一个字符串作为输入参数。首先将其拆分为单个字符,然后构造单链表,最后返回头节点。这里用了一个无值的头结点,方便统一处理。