楼主: pinseng
2155 7

[问答] zz: 一道sas的题目,涉及到算法 [推广有奖]

  • 2关注
  • 3粉丝

硕士生

20%

还不是VIP/贵宾

-

威望
0
论坛币
395 个
通用积分
26.2433
学术水平
5 点
热心指数
8 点
信用等级
6 点
经验
2075 点
帖子
135
精华
0
在线时间
116 小时
注册时间
2006-11-11
最后登录
2016-6-23

楼主
pinseng 发表于 2011-1-30 07:54:15 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
zz from mitbbs

给定字符串,求其不出现重复字符的子字符串的最大长度,如何测试。比如,“abcabcbb”最大的就是“abc”长度3, “bbbbb”最大就是“b”长度1。"abbcbba"长度为2.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:sas的 MITBBS From ABC 字符串 题目 SAS 算法

回帖推荐

sber 发表于4楼  查看完整内容

data s(keep=a n); a="guiydtudug"; l=length(a); do i=1 to l; z=substr(a,i,1); do k=i+1 to l; if substr(a,k,1)=z then do; n=k-1; output; end; end; end; proc sort; by n; run; 出来的数据集S中的第一条观测中变量N的值就是不重复的最长长度。

本帖被以下文库推荐

沙发
liudeng2005 发表于 2011-1-30 08:27:04
简单啊,读“abcdegg......xyz”26个字母的字符串,外循环26次,依次读取26个字母,内循环次数=字符串长度次数,依次读取每个字母并和外循环的比较,外循环每循环一次计算1次,最后加起来就ok了.

此算法在字符串短的时候可能不会是最快i的,但应该是最最直观的。在字符串长了的时候应该是最快的,因为没有了排序和比较!
我就是我@!

藤椅
pinseng 发表于 2011-1-30 09:29:08
能不能写个code看看? 谢谢

板凳
sber 发表于 2011-1-30 11:54:13
data s(keep=a n);
a="guiydtudug";
l=length(a);
do i=1 to l;
z=substr(a,i,1);

do k=i+1 to l;
if substr(a,k,1)=z then do;
n=k-1;
output;
end;
end;
end;
proc sort;
by  n;
run;
出来的数据集S中的第一条观测中变量N的值就是不重复的最长长度。
已有 2 人评分经验 论坛币 热心指数 收起 理由
bakoll + 3 + 3 精彩帖子
crackman + 3 鼓励积极发帖讨论

总评分: 经验 + 3  论坛币 + 3  热心指数 + 3   查看全部评分

报纸
sber 发表于 2011-1-30 11:56:16
上面CODE中的变量a的值是给定的字符串,呵呵,我的方法比较笨 ,抛砖引玉啦!

地板
pinseng 发表于 2011-1-30 13:07:16
明白了  谢谢
每取一个字符,然后那后面所有的做对比,看看有没有相同的
谢谢啦

7
sber 发表于 2011-1-31 19:00:38
昨天写的程序不大好,今天改进了一下,呵呵,假设原字符是S,最大长度是want.
data a (keep=s want);
s="abcabcbb";

l=length(s);

do i=1 to l;
t=substr(s,(i+1));
u=substr(s,i,1);
m=find(t,trim(u));
r=m+i-1;

if m gt 0 then want=min(r,want);
if want=. then want=l;
end;
run;

8
yixufeng 发表于 2011-2-11 18:02:56
上面的结果不对啊,比如s='"babcdbabcdbb', 实际结果是babcdb,长度为6。
可参考《编程珠玑》这本书,大致的算法是:
取字符串所有的后缀,然后对所有的后缀进行排序,找出前后后缀间最大的长度,然后取最大长度的max, 即是原字符串的子字符串的最大长度,在这过程中需考虑是否重复子字符串。
给个例子:s="cacacb"
后缀1: cacacb;
后缀2: acacb;
后缀3: cacb;
后缀4: acb;
后缀5: cb;
后缀6: b.
然后排序即为:
acacb
acb
b
cacacb
cacb
cb
排序后比较:
acacb与acb,长度为2(子字符串ac);
acb与b, 长度为1(子字符串b);
...
最后可得原字符串最大子字符串长度为3(子字符串cac)

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-31 05:42