python实现求pnext
时间: 2023-07-07 16:22:28 浏览: 81
下面是 Python 实现求字符串的 pnext 表的代码:
```python
def get_pnext(pattern):
pnext = [-1] * len(pattern)
j, k = 0, -1
while j < len(pattern) - 1:
if k == -1 or pattern[j] == pattern[k]:
j += 1
k += 1
pnext[j] = k
else:
k = pnext[k]
return pnext
```
其中,变量 j 和 k 分别表示当前正在计算的位置和最长前缀的末尾位置(即 pnext[j] 的值),初始时都为 0 和 -1。while 循环的条件是 j < len(pattern) - 1,因为第一个元素的 pnext 值为 -1,不需要计算。在循环中,我们依次计算每个位置的 pnext 值。
如果 k 等于 -1 或者 pattern[j] 等于 pattern[k],则说明当前位置的最长前缀可以扩展到 k+1,因此 pnext[j+1] 的值为 k+1。否则,我们需要将 k 更新为 pnext[k],即使最长前缀变短,直到找到一个前缀与 pattern[j] 匹配或者 k 变成了 -1。需要注意的是,如果 k 等于 -1,说明当前位置的最长前缀为空,因此 pnext[j+1] 的值为 0。
最终,我们返回 pnext 数组。
相关问题
struct SL *Split(struct SL **S1,struct SL **S2) { struct SL *SL1,*SL2; struct SL *pnext,*ptail,*plow; SL1=*S1; SL2=*S2; pnext=SL1->next; plow=SL1; while(pnext){ if(pnext->data%2==0){ if(!(SL2->next)){ SL2->next=pnext; ptail=SL2->next; } else{ ptail->next=pnext; ptail=ptail->next; } pnext=pnext->next; plow->next=pnext; } else{ plow=pnext; pnext=pnext->next; } } }
这段代码实现了将链表中的偶数节点移到另一个链表中,同时保留原链表中的奇数节点。具体来说,它将链表 S1 中的偶数节点移到链表 S2 中,然后返回链表 S2 的头指针。
具体实现过程如下:
1. 定义两个指针 SL1 和 SL2,分别表示链表 S1 和链表 S2 的头节点。
2. 定义三个指针 pnext、ptail 和 plow,分别表示当前节点、链表 S2 的尾节点和链表 S1 的前一个节点。
3. 将 pnext 指向链表 S1 的第一个节点,将 plow 指向链表 S1 的头节点。
4. 循环遍历链表 S1 中的每个节点,直到 pnext 为空。
5. 对于偶数节点,将它从链表 S1 中删除,并插入到链表 S2 中。
6. 如果链表 S2 中还没有节点,则将当前偶数节点作为链表头节点,并将 ptail 指向它。
7. 如果链表 S2 中已经有节点,则将当前偶数节点插入到链表 S2 的尾部,并更新 ptail 指针。
8. 将 pnext 指向下一个节点,将 plow 的 next 指针指向 pnext,表示将当前节点从链表 S1 中删除。
9. 对于奇数节点,将 plow 指向 pnext,将 pnext 指向下一个节点,继续循环。
10. 最后返回链表 S2 的头指针 SL2。
需要注意的是,这段代码存在一些问题:
1. 在插入偶数节点到链表 S2 的时候,没有将节点的 next 指针置为 NULL,可能会导致链表出现环。
2. 在删除偶数节点时,没有判断链表 S1 是否为空,可能会出现空指针异常。
3. 在删除偶数节点时,没有更新链表 S1 的尾节点,可能会导致链表 S1 的尾节点不正确。
4. 在函数返回前,没有将链表 S2 的尾节点的 next 指针置为 NULL,可能会导致链表出现环。
for (auto& _Pnext = _Myproxy->_Myfirstiter; _Pnext; _Pnext = _Pnext->_Mynextiter) { // TRANSITION, VSO-1269037 _Pnext->_Myproxy = nullptr;}已引发异常,引发了异常:读取访问权限冲突,_Pnext 是 0x398D06E6。这种报错是为什么,应该怎么改
这种报错通常是由于对已经被释放的内存进行访问引起的。在这段代码中,可能是 `Myfirstiter` 中的某个元素已经被释放,但是其指针还存在于链表中,导致在遍历链表时出现了访问冲突。
要解决这个问题,需要找到释放该指针的代码,并检查是否存在对已经被释放的指针进行访问的情况。如果是这种情况,可以将代码修改为在释放指针后,将指针设置为 `nullptr`,以避免访问已经被释放的内存。另外,还可以在遍历链表时添加对指针是否为 `nullptr` 的判断,以避免访问已经被释放的指针。
阅读全文