菜鸟求助一个经典的动态规划题

菜鸟程序员员 2016-03-19 10:11:10
题目是这样的:计算两个字符串的最大公共字串的长度,字符不区分大小写。样例输入:asdfas werasdfaswer 样例输出:6
这是华为obj上的一道初级题,我知道这道题应该用动态规划做,可是我水平实在太低,以前看过一次动态规划,全忘了,根本不会运用到实例中来。于是乎,我就用最最原始的方法:for循环,就是先比较两个字符串那个短,把短的取出来,第一次逐个拿出一个字符,到长的字符串里去找,然后逐个拿出两个字符,再到长的字符串里去找,于是,我用了几个for循环的嵌套,终于写出来了可是,提交到华为测试平台一看,case2错误,可是这道题下面评论提出的测试用例我全能通过啊,自己试了好多,也全通过,实在不知道那个case2是什么?各位大神们帮我看看我哪里错了,代码太乱,大神们将就看看
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<ctype.h>
#include<stdbool.h>
#include<string.h>
int f(char *, char *);
int main(void)
{
char a[100] = { '\0' }, b[100] = {'\0'};
scanf("%s%s", a, b);
int i, lena, lenb;
lena = strlen(a); lenb = strlen(b);
for (i = 0; i < lena; i++)
{
if (isalpha(a[i]))
a[i] = tolower(a[i]);
}
for (i = 0; i < lenb; i++)
{
if (isalpha(b[i]))
b[i] = tolower(b[i]);
}
printf("%d\n", f(a, b));
system("pause");
return 0;
}
int f(char *a, char *b)
{
int lena, lenb;
lena = strlen(a); lenb = strlen(b);
int tempnum;
char tempc[100] = { '\0' };
if (lena > lenb)
{
tempnum = lena;
lena = lenb;
lenb = tempnum;
strcpy(tempc, a);
strcpy(a, b);
strcpy(b, tempc);
}
int i, j, n, n1, k, m, p[100] = { 0 }, q[100] = { 0 },r=0,max;
char c[100][100] = { '\0' }; char d[100] = { '\0' };
for (i = 0; i < lena; i++)
{
n = 0;
for (j = 0; j < lena - i; j++)
{
n1 = 0;
for (k = j; k <= j + i;k++)
c[n][n1++] = a[k];
n++;
}
for (j = 0; j < n; j++)
for (k = 0; k < lenb - i; k++)
{
n1 = 0;
for (m = k; m <= k + i; m++)
d[n1++] = b[m];
if (strcmp(c[j], d) == 0)
p[k]=i;
}
max = p[0];
for (j = 0; j < 100; j++)
if (p[j]>max)
max = p[j];
q[r++] = max;
}
max = q[0];
for (i = 0; i < 100; i++)
if (q[i]>max)
max = q[i];
return max+1;
}
...全文
263 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
pkuzhx 2016-03-22
  • 打赏
  • 举报
回复
还不给注册……
liehu232 2016-03-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<string.h>
#include<stdlib.h>
void lower(char *a) {
	for (int i = 0; a[i] != '\0'; i++) {
		if (a[i] >= 'A' && a[i] <= 'Z') {
			a[i] = a[i] - 'A' + 'a';
		}
	}
}
int max(int a, int b) {
	return (a > b ?  a : b);
}

int main()
{
	char a[100] = "aaa", b[100] = "abb";
	int dp[100][100];
	//scanf("%s%s", a, b);
	lower(a);
	lower(b);
	for (int i = 1; a[i - 1] != '\0'; i++) 
		for (int j = 1; b[j - 1] != '\0'; j++) {
			dp[i - 1][j-1] = 0;
		}

	for (int i = 1; a[i-1] != '\0'; i++) {		
		for (int j = 1; b[j-1] != '\0'; j++) {
			if (a[i-1] == b[j-1]) {
				dp[i][j] = dp[i - 1][j-1] + 1;
			}
			else {
				dp[i][j] = max(dp[i - 1][j],dp[i][j-1]);
			}
		}
	}
	printf("%d\n", dp[strlen(a)][strlen(b)]);
	system("pause");
    return 0;
}
上面那个不能处理有重复字符的字符串
liehu232 2016-03-21
  • 打赏
  • 举报
回复
#include "stdafx.h"
#include<string.h>
#include<stdlib.h>
void lower(char *a) {
	for (int i = 0; a[i] != '\0'; i++) {
		if (a[i] >= 'A' && a[i] <= 'Z') {
			a[i] = a[i] - 'A' + 'a';
		}
	}
}
int max(int a, int b) {
	return (a > b ?  a : b);
}

int main()
{
	char a[100] = "abb", b[100] = "aca";
	int dp[100];
	//scanf("%s%s", a, b);
	lower(a);
	lower(b);
	dp[0] = 0;
	for (int i = 1; a[i-1] != '\0'; i++) {
		for (int j = 1; b[j-1] != '\0'; j++) {
			if (a[i-1] == b[j-1]) {
				dp[i] = max(dp[i - 1] + 1,dp[i]);
			}
			else {
				dp[i] = max(dp[i - 1],dp[i]);
			}
		}
	}
	printf("%d\n", dp[strlen(a)]);
	system("pause");
    return 0;
终于能上网了
liehu232 2016-03-21
  • 打赏
  • 举报
回复
电脑上不了网,只能手机发图片了
醉花阴柳 2016-03-20
  • 打赏
  • 举报
回复
引用 4 楼 qq_29120981 的回复:
不区分大小写的话先把字符串预处理一下
这个呢

#include<stdio.h>
#include<string.h>
#define MAX 100

int main(void)
{
	char str1[MAX]={0},str2[MAX]={0},buf[MAX];
	int i,j,k,l,ans,len,flag=0;
	ans = 0;
	scanf("%s%s",str1,str2);
	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1);
	for(i=1;i<=len;i++)
	{
		for(k=0;k<len;k++)
		{
			for(l=0;l<i&&l+i<len;)
			{
				for(j=0;j<i;j++,l++)
					if(strlen(str1)>len&&str2[l+k]!=0)
						buf[j] = str2[l+k];
					else if(strlen(str1)<=len&&str2[l+k]!=0)
						buf[j] = str1[l+k];
				buf[j] = 0;
				//printf("%s\n",buf);
				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL)
					break;
				if(i>ans)
				{
				    ans = i;
				    flag = !flag;
				    break;
				}
			}
			if(flag)
            {
                flag = !flag;
                break;
            }
		}
	}

	printf("%d",ans);
	return 0;
}
菜鸟程序员员 2016-03-20
  • 打赏
  • 举报
回复
引用 3 楼 qq_29120981 的回复:
仅供参考

#include<stdio.h>
#include<string.h>
#define MAX 100

int main(void)
{
	char str1[MAX],str2[MAX],buf[MAX];
	int i,j,k,l,ans,len;
	ans = 0;
	scanf("%s%s",str1,str2);
	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1);
	for(i=1;i<=len;i++)
	{
		for(k=0;k<len;k++)
		{
			for(l=0;l<i;)
			{
				for(j=0;j<i;j++,l++)
					if(strlen(str1)>len)
						buf[j] = str2[l+k];
					else
						buf[j] = str1[l+k];
				buf[j] = 0;
				//printf("%s\n",buf);
				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL)
					break;
				if(i>ans) 
					ans = i;
			}
		}
	}
	
	printf("%d",ans);
	return 0;
}
大胸第,你这个程序跑不出结果
醉花阴柳 2016-03-19
  • 打赏
  • 举报
回复
不区分大小写的话先把字符串预处理一下
醉花阴柳 2016-03-19
  • 打赏
  • 举报
回复
仅供参考

#include<stdio.h>
#include<string.h>
#define MAX 100

int main(void)
{
	char str1[MAX],str2[MAX],buf[MAX];
	int i,j,k,l,ans,len;
	ans = 0;
	scanf("%s%s",str1,str2);
	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1);
	for(i=1;i<=len;i++)
	{
		for(k=0;k<len;k++)
		{
			for(l=0;l<i;)
			{
				for(j=0;j<i;j++,l++)
					if(strlen(str1)>len)
						buf[j] = str2[l+k];
					else
						buf[j] = str1[l+k];
				buf[j] = 0;
				//printf("%s\n",buf);
				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL)
					break;
				if(i>ans) 
					ans = i;
			}
		}
	}
	
	printf("%d",ans);
	return 0;
}
菜鸟程序员员 2016-03-19
  • 打赏
  • 举报
回复
测试用例是4个。。。。。。
菜鸟程序员员 2016-03-19
  • 打赏
  • 举报
回复
大神们,这道题测试用例有3个,我就是case2不通过。这道题评论有12页,评论里提出来的用例我全通过,就是平台上的case2不通过,很苦恼

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧