Chinaunix
标题:
刚碰上的问题,希望能找到最好的解决方法
[打印本页]
作者:
welf
时间:
2008-01-13 15:48
标题:
刚碰上的问题,希望能找到最好的解决方法
有一个链表,节点内容可能是若干个有序字符串的其中一个字符或字符串本身,举个例子,字符串的集合是"abcd","efgh"
链表是a->b->c->d->e->g->h->abcd->efgh.现要对其处理,a->b->c->d能顺序合并成"abcd',e->g->h就不行,应此去掉这三个节点,最后得到的链表是abcd->abcd->efgh.
因为链表巨大,理想的情况是只遍历一趟,尽量不占用额外的空间。
作者:
caijimin
时间:
2008-01-13 19:56
如果字符串的集合是预先已知的,应该可以。 否则涉及到回溯,只遍历一遍不大可能。
作者:
Nzm
时间:
2008-01-13 20:39
觉得可以分配点空间存储有可能要合并的字符或字符串.这样还是可能一次遍历的.
作者:
cuichaox
时间:
2008-01-13 21:30
如果预定义子串中,有“abc”, “abcde”。 是优先匹配长的,还是短的?
初步考虑, 可以实现:
两个状态集合:
静态的(集合元素不变化), - 包括所有要匹配的字符串。
动态的(集合元素变化) - 记录匹配到"中途"的状态。
如果,字符串的集合是"abcd","efgh"
静态状态机集合中有两个状态:
//状态应该使用恰当的类,或数据结构实现,下面只简单描述
1: {dest="abcde", nMatched=0};
2: {dest="efgh",nMatched=0};
dest=要匹配的字符串, nMatched=已经匹配成功的字符个数
如果当前列表中得到下一个字母为'*', 对所有状态机输入这个字母'*'。for each state:
(1)如果对“静态集合”中一个状态产生了匹配(dest[nMatched]='*'),生成新状态(nMatched加了1)插到"动态集合"。
(2)如果对“动态集合”中的状态产生了匹配(dest[nMatched]='*'),nMathed++.
(3)对动态状态机集合中的状态,一但不能匹配(dest[nMatched]!='*'),删除这个状态.
(4)当出现完整匹配时, 出现: nMatched == strlen(dest); 就发现了目的节点的一个字符串。生成节点,删除所有动态集合的状态(如果优先匹配短的,否则。。。)
如下:
初始动态状态机集合为空:
输入a后
动态状态机集合:
1: {dest="abcde", nMatched=1};
输入b后
动态状态机集合:
1: {dest="abcde", nMatched=2};
输入c后
动态状态机集合:
1: {dest="abcde", nMatched=3};
.... ...
[
本帖最后由 cuichaox 于 2008-1-14 12:58 编辑
]
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2