QA输出最长不重复子串(附加思维流程图)
弄了一个通宵,终于把代码抖出来了,感觉这个写得还是不错的。
在解决编程应用题的时候,一开始难免会遇到无从下手,找不到思路的情况,于是我就在写程序之前把程序框架以及思维流程模拟出来,个人觉得这种写流程图解编程应用题的方法不错,于是把一个样板拿出来给大家参考一下。
流程图就像起房子的图纸,写程序按照该流程图来写的。特别是遇到逻辑理解上档次的时候,写流程图能增强对程序的理解能力,而且找出错误的位置及其性质也会相对容易一些。
程序代码:/*题目:找出最长没有重复字符的子串*/
/*
#思路:
1-建立ACSII表判断重复字符
2-记录本串长度-两个重复字符出现的位置,以及第一个字符出现的位置
3-下次判断以第一个字符的下一个字符开始,判断位置从子串端的下一个字符开始
4-如果出现子串较长,则更记录最长新子串的位置
5-执行上述操作用选择法出最长字符,以及最长子串的位置,读出数据
#需要用到的主要变量:
1-ASSII表ASS[256]
2-起始指针p1(值为子串左端位置)
3-检索指针p2(值为子串右端位置)
4-记录指针p3(值为子串出现重复字符的左端位置)
5-记录最长子串起始位置的指针p_Max
6-记录子串长度变量L
7-记录最长子串长度L_Max
#需要用到的函数
1-char *fun(char *p1,char **p2)
说明:-记录最长子串。
返回值:
(条件分歧)如果检索指针p2没有走到尾部
返回子串出现重复字符左端的位置p1
(如果检索指针p2走到尾部)
就返回起始位置,依然为p1
返回后用l=p2-p3记录子串长度
返回后把L_max与原L比较,如果L_max>L则记录最长子串指针p_Max=p1;
#结构
循环结构(循环执行条件: strlen(p1)>L_Max)/*就是说当p1指向剩余字符串长度大于所求子串最大值
{
(注意:)开头要用p3=p1;\\目的是保留本次字执行符串操作的起始位置
尾部要加p1++,p2++;意思是移动指针从检索出重复字符的到下一个位置开始检验
}*/
#include<stdio.h>
#include<string.h>
char *fun(char *p1,char **p2)
{
static int ASS[256]={0};
for (;++ASS[**p2]!=2&&**p2;++*p2);
if (!**p2)
return p1;
for (--ASS[*p1];*p1!=**p2;--ASS[*p1])
++p1;
return p1;
}
int main()
{
char s[80];
char *p1,*p2,*p3,*p_Max;
int L,L_Max;
L=L_Max=0;
p_Max=p1=p2=p3=s;
gets(s);
while (strlen(p1)>L_Max)
{
p3=p1;
p1=fun(p1,&p2);
L=p2-p3;
if (L>L_Max)
{
L_Max=L;
p_Max=p3;
}
p1++;
p2++;
}
printf("%.*s\n",L_Max,p_Max);
return 0;
}
[此贴子已经被作者于2016-12-9 03:54编辑过]









