字典生成(100分)

  • 主题发起人 主题发起人 chenziyi
  • 开始时间 开始时间
C

chenziyi

Unregistered / Unconfirmed
GUEST, unregistred user!
我想编写一个函数,形式如下:
function nextstr(s:string):string;
这个函数完成这样的功能,任意输入一个字符串(只含有a..z字符和数字0..9,不区分大小写),要返
回按照字典排序的下一个字符串。
比如:输入a,返回b,输入aa,返回ab,输入zzz,返回aaaa。
不知道哪位大虾可以帮助我。
分数不够可以再加。
 
function nextstr(s: string): string;
var
i: Integer;
begin
s := LowerCase(s);
i := Length(s);
while i > 0do
begin
if s = '9' then
begin
s := 'a';
if i = 1 then
s := 'a' + s;
end
else
if s = 'z' then
begin
s := '0';
break;
end
else
begin
s := Succ(s);
break;
end;
Dec(i);
end;
nextstr := s;
end;
 
请看 http://www.delphibbs.com/delphibbs/dispq.asp?lid=667494 有完整解决方案。
 
to creation-zy:
我觉得这种解决方法似乎有问题:比如dic('a9')='b9',事实上='ba'。用这种方法生成的只是全部的一个子集。
to libin06:
我觉得你的方法基本上可行,但是有一个问题:
if s = 'z' then
begin
s := 'a';
//这里应改为:s := 'a',否则的话,用'a'开始生成字符串,将得不到
数字。
我已经测试过改了的方案,似乎是可行的,请大家继续发表看法。
谢谢
 
对不起,写错了
s := 'a';
//这里应改为:s := '1',否则的话,用'a'开始生成字符串,将得不到
 
你到底是什么意思呢?你的问题如果是36进制的加法,那么zzz加一就应该得1000,
而不是aaa,告诉我你的表示序列。如:'0'..'9','a'..'z',这样z的下一个应该
是0。
 
我的本意就是按字典排序生成一列字符串:
a
b
..
0
1
..
9
aa
ab
...
az
a1
a2
..
a9
ba
bb
..
b9
za
..
 
按你的序列应该是:
zzz->zz0
999->aaaa
对不对?
 
to:libin06
是的.
 
我已经在原贴上做了修改。
 
谢谢,我测试了一下,应该没问题。
晚上,我会仔细测试一下,分晚上给你加上。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=919945 的基础上作小小改动:
(仍然是使用递归)
function getnext(s:string):string;
var
len:integer;
c:char;
begin
len:=length(s);
if len=0 then
result:='a'
else
begin
c:=s[len];
inc(c);
if (c>'9')and(c<'a') then
begin
if len>1 then
result:=getnext(copy(s,1,len-1))+'a'
else
result:='aa';
end
else
begin
if c>'z' then
c:='0';
s[len]:=c;
result:=s;
end;
end;
end;
 
后退
顶部