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编辑过]