首页 新闻 会员 周边 捐助

关于字符串编辑的算法设计

0
[待解决问题]

一个字符串,经过N个人编辑。要求得到一个字符串,这个字符串展现每个人增加了哪些字符,删除了哪些字符。可以添加类似html或者xml标签来标记具体哪个人对哪些字符串做了哪些操作(增加删除)。如何实现?或者提供一个思路。比如:

原始字符串:

12345678

A编辑后:

135789,则A删除了2 4 6,增加了9;

B编辑后:

1235678,则B删除了9,增加了2 6,

jone_e的主页 jone_e | 小虾三级 | 园豆:1410
提问于:2013-06-24 16:39
< >
分享
所有回答(2)
0

类似redo和undo的实现

需要两个表,一个存储add,一个存储del,表中有操作人,字符串,操作对象,操作位置(index),操作时间(顺序)

举个栗子:

Del表

操作人    字符串             操作对象   操作位置   顺序

B          123456789           9           8          0

A          123456789           2           1          1

A          13456789             4           2          2

A          1356789               6          4           3

 

从del表倒叙查找,逐个恢复即可还原字符串

 

如果单纯的记录谁添加或删除了什么,就直接存数组,不用管操作顺序

栗子:

做一个操作人类,里面有操作人和操作对象

class oper

{

     string name;

     string num;

}

A编辑后:

12345789,A删除了2 

 

oper myoper = new oper();

myoper.name = "A";

myoper.num = 2;

lstDel.Add(myoper);

WuRang | 园豆:1730 (小虾三级) | 2013-06-24 16:53

感谢你的回复。

不过我要的效果是这个样子的:原始字符串:12345678

A编辑以后的字符串:13579

则结果是:

1 <A_del>2</A_del> 3 <A_del>4</A_del> 5 <A_del>6</A_del> 7

<A_del>8</A_del><A_add>9</A_add>

B(在A的基础上,也就是13579的基础上)编辑以后的字符串是:12457890

则结果是:

1 <A_del>2</A_del> <B_add>2</B_add> <B_del>3</B_del> <B_add>4</B_add><A_delete>4</A_delete> 5 <A_del>6</A_del> 7 <A_del>8</A_del><B_add>8</B_add><A_add>9</A_add> <B_add>0</B_add>

 

上面写的有点儿乱,不知道你是否理解我的意思。就是每个人做的任何一个操作都要把它记下来。最好不要借助数据库。要算法实现。当然,那些标签是我自己定义的,也可以写成其他的。

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2013-06-24 18:13

@jone_e: 我觉得你分开存比较好

1 <A_del>2</A_del> <B_add>2</B_add> <B_del>3</B_del> <B_add>4</B_add><A_delete>4</A_delete> 5 <A_del>6</A_del> 7 <A_del>8</A_del><B_add>8</B_add><A_add>9</A_add> <B_add>0</B_add>

这么一存你就不知道A和B的操作顺序了,也就没法说“B(在A的基础上,也就是13579的基础上)编辑以后的字符串是:12457890”

 

建议这么存:

源字符串:12345678

<A_del>2</A_del>

<A_del>4</A_del>

<A_del>6</A_del>

<A_Add>9</A_Add>

<B_Del>9</B_Del>

<B_Add>4</B_Add>

<B_Add>6</B_Add>

上面就是按操作顺序存的

支持(0) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-06-25 09:03

@WuRang: 首先,再次感谢你的热心回复。

其实,我并不关心每个人的操作顺序,我只关心每个人的操作结果。实际的业务逻辑大概是这样的:

比如:某人写了一篇文章,就叫文章X,分别交给A,B,C,D四个人编辑。每个人编辑后,都产生了一篇新的文章,分别是文章A,文章B,文章C,文章D。我现在需要比较X,A,B,C,D这5篇文章,得出一篇文章,这篇文章可以展示A,B,C,D这四个人分别做了哪些改动。

如果是这种业务逻辑,其实我并不关心每个人的操作顺序,我只关心他们到底改动了什么内容,然后我把这些内容分别用html标签表示出来,展示在网页上。

上图是我做的一个效果。每个人的改动都分配一种颜色,划横线的表示删除,带颜色的字体表示与颜色对应的哪个人添加的内容。

其实上图的效果并不完全正确,因此就有了博客园的这个提问。

 

不知道,针对这个业务逻辑,你有没有什么更好的解决方案。当然,你上面的回答其实已经给了我一些启示,我沿着那条路往下走,发现困难挺多。。

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2013-06-25 13:45

@jone_e: 有几个不明白的地方

1.某人写了一篇文章,就叫文章X,分别交给A,B,C,D四个人编辑。每个人编辑后,都产生了一篇新的文章

也就是说ABCD四个人编辑的都是源X,这就和题目中的问题冲突,题目中B是在A编辑后产生的X1的基础上做的编辑而不是源X

原始字符串:

12345678

A编辑后:

135789,则A删除了2 4 6,增加了9;

B编辑后:

1235678,则B删除了9,增加了2 6

 

2.每个人的改动都分配一种颜色,划横线的表示删除,带颜色的字体表示与颜色对应的哪个人添加的内容。

不理解是什么意思,贴出来的图表示的是什么?是每个人修改后文章的超链接?

支持(0) 反对(0) WuRang | 园豆:1730 (小虾三级) | 2013-06-25 14:16

@WuRang: 哦,我说错了,我不应该写成分别交给A,B,C,D。应该是A修改X,B在A的基础上修改,C在B的基础上修改,D在C 的基础上修改。

关于颜色:

比如A的修改的内容用红色表示,则A增加的内容是红色字体的,A删除的内容的删除线是红色的,

B修改的内容用蓝色表示,则B增加的内容是蓝色字体的,B删除的内容的删除线是蓝色的,同时如果B删除了A增加的内容,则这段内容字体是红色的,删除线是蓝色的;

关于贴出来的图:

这个图是我目前做到的效果,但是这个效果是有问题的,未能实现我期望的结果。只是想给你一个对期望结果的直接展示,没想到让你误解了。

谢谢你这么热心。这段时间忙,没有常来博客园。还是博客园好啊。

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2013-06-25 15:50

@jone_e: 还在研究中。up

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2013-08-20 15:59
0

这个项目有意思,研究一下   mark~~

楼主解决了么?

提供个线索

悠扬的牧笛 | 园豆:156 (初学一级) | 2013-09-13 10:58

我还没有解决。。。最近忙,没时间管这个了。

支持(0) 反对(0) jone_e | 园豆:1410 (小虾三级) | 2013-09-13 13:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册