字符串问题求解(100分)

  • 主题发起人 主题发起人 wangyw_77
  • 开始时间 开始时间
W

wangyw_77

Unregistered / Unconfirmed
GUEST, unregistred user!
var str1,str2,str3 :string
已知str2为str1的子串,如下例所示
str1 := ('A0001','A0002','A0010','A0020','A0050','A0100','A0111');
str2 := ('A0001','A0010','A0020','A0111');
如何用最简单的算法求出str3来呢?(str3为str1中除去str2中的部分)
即str3 := ('A0002','A0050','A0100')
请各位富翁不吝赐教

 
用集合相减
 
老大,请说清楚些吧
小弟是菜鸟
 
to wangyw_77
你这问题好办!不过你得说清,你这是字符串还是字符串数组,两者用的方法不同:
字符串应是:a:="12345678", b:="456",你是否求:c:="12378"?????
 
procedure splitstring(s:string;delim:char;ts:tstrings);
{splits a compound string (s) delimited by (delim) into TStrings (ts)}
{example SplitString('Tony,Blair,Downing Street,London',',',ts) returns:
ts.count=4
ts[0]='Tony'
ts[1]='Blair'
ts[2]='Downing Street'
ts[3]='London'}

先分割字符窜 str2,splitstring(str2;',';ts:tstrings);
判断 再用str1-ts[1..ts.count]
procedure SplitString(s:string;delim:char;ts:TStrings);
var
i:integer;
t:string;
begin
t:='';
for i:=1 to length(s) do
begin
if (s<>delim) then t:=t+s else
begin
ts.add(t);
t:='';
end;
end;
if t<>'' then ts.add(t);
end;
 
用一个排序的TStringList存放Str2的拆分结果。然后用挨个用IndexOf查找Str1的拆分结果是否在Str2中,
如不在,则向Str3添加。
 
不能用集合,自己编一个小过程吧,不难,就是有点烦,
头有点晕,你就自己编一个吧
 
本身的设计思想就有问题,就是解决了也是很痛苦的事。
不要给我分,只是说说。
 
我也知道设计思想有问题,不过既然走到了这一步就要解决。山泉和creation-zy的
思路都很好,就是有点麻烦。我想看看各位有没有更好的思路或算法。
to lianzj:可以这样理解
a:="12345678", b:="2567",求:c:="1348"?????
 
function GetXXStr(Str,SubStr:String):String;
var
i:integer;
begin
Result:='';
for i:=1 to Length(Str) do
if Pos(Str,SubStr)<=0 then Result:=Result+Str;
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
icount:integer;
aaa,bbb:string;
xxx,yyy,zzz:set of char;
begin
xxx:=[];
yyy:=[];
aaa:='12345678';
bbb:='1348';
for icount:=1 to length(aaa) do
xxx:=xxx+[aaa[icount]];
for icount:=1 to length(bbb) do
yyy:=yyy+[bbb[icount]];
zzz:=xxx-yyy;
end;
 
接受答案了。张剑波同志用的方法是我没有想到的,所以给他多加了20分,
各位不会有意见吧?
另外,顺便问一句张剑波同志:set of char 类型的如何转换成字符串类型的?
如何访问set of char 类型的数据呀?
 
张剑波用的方法是集合法。他通过3个Char集合实现了针对字符的集合操作(注意,不是字符串)。
由于在Pascal语言中,集合的元素仅能为范围小于256的有序类型,所以绝对不可能用其实现字符串
的集合操作。如果要实现您在上面提出的针对字符串的集合操作,我还是坚持TStringList的方案。

>就是解决了也是很痛苦的事。
同意。
 
to wangyw_77 :
sorry,来晚了.
to creation-zy:
TStringList的方案表示赞同.
集合法勉强能求出,优点算法明确,缺点范围窄:
procedure TForm1.Button1Click(Sender: TObject);
var
icount:integer;
aaa,bbb,ccc:string;
xxx,yyy,zzz:set of char;
begin
xxx:=[];
yyy:=[];
aaa:='12345678';
bbb:='1348';
ccc:='';
for icount:=1 to length(aaa) do
xxx:=xxx+[aaa[icount]];
for icount:=1 to length(bbb) do
yyy:=yyy+[bbb[icount]];
zzz:=xxx-yyy;
for icount:=0 to 9 do
begin
if chr(48+icount) in zzz then
ccc:=ccc+chr(48+icount);
end;
showmessage(ccc);
end;



 
to 张剑波:明白了
to all:多谢各位的热心帮助,问题终于解决了,虽然( 就是解决了也是很痛苦的事。
同意。),嘻嘻。。。更重要的是又学习了不少知识,再次谢谢各位
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部