String 为什么这需要动态规划?
可以找到问题陈述,它说DP解决方案需要O(m*n)时间。但是为什么我们需要DP呢?我已经编写了以下解决方案,但不确定是否需要DPString 为什么这需要动态规划?,string,algorithm,dynamic-programming,sequences,String,Algorithm,Dynamic Programming,Sequences,可以找到问题陈述,它说DP解决方案需要O(m*n)时间。但是为什么我们需要DP呢?我已经编写了以下解决方案,但不确定是否需要DP String str1,str2; str1 = "OldSite:GeeksforGeeks.org"; str2 = "NewSite:GeeksQuiz.com"; int i,j,k; int count,currentMax =0; for(i = 0; i < str1.length();i++){
String str1,str2;
str1 = "OldSite:GeeksforGeeks.org";
str2 = "NewSite:GeeksQuiz.com";
int i,j,k;
int count,currentMax =0;
for(i = 0; i < str1.length();i++){
count = 0;
k = i;
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax)
currentMax = count;
continue;
}
if(count > currentMax)
currentMax = count;
}
System.out.println(currentMax);
字符串str1、str2;
str1=“OldSite:geeksforgeks.org”;
str2=“NewSite:geeksquick.com”;
int i,j,k;
整数计数,当前最大值=0;
对于(i=0;i当前最大值)
currentMax=计数;
继续;
}
如果(计数>当前最大值)
currentMax=计数;
}
系统输出打印项次(当前最大值);
即使我的解决方案也需要O(m*n),但我似乎没有按照DP的方式来做
我所做的是检查string1中的每个字符,string2中可用的最大长度是多少
基本上我认为这是蛮力方法
我的解决方案有问题吗
编辑如评论部分所述
进行更改以生成正确的结果将内部for循环更改为
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax){
currentMax = count;
count = 0;
k=i;
}
else{
count = 0;
k=i;
}
continue;
}
for(j=0;j当前最大值){
currentMax=计数;
计数=0;
k=i;
}
否则{
计数=0;
k=i;
}
继续;
}
编辑2以获取评论
for(j = 0; j < str2.length() && k < str1.length();j++){
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
else if(count > currentMax){
currentMax = count;
count = 0;
k=i;
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
}
else{
count = 0;
k=i;
if(str1.charAt(k) == str2.charAt(j)){
count++;
k++;
}
}
continue;
}
for(j=0;j当前最大值){
currentMax=计数;
计数=0;
k=i;
if(str1.字符(k)=str2.字符(j)){
计数++;
k++;
}
}
否则{
计数=0;
k=i;
if(str1.字符(k)=str2.字符(j)){
计数++;
k++;
}
}
继续;
}
我认为您为最长的公共子字符串编写的代码无效。请尝试输入:-
str1 = "swring";
str2 = "skwkring";
这里最长的常用子字符串是“ring”,它是4个字符,但您的代码给出了“6”的答案。这里我认为您的代码只是计算字符串中的公共字符,它是“swring”,所以结果是6
在O(n*m)中使用蛮力无法解决这个问题,尽管使用DP似乎很明显
编辑:-
str1 = "sbsringada";
str2 = "cdssringasd";
int max = 0;
for(int i=0;i<str1.length,i++) {
for(int j=0;j<str2.length;j++) {
int k = 0;
for(;j+k<str2.length && i+k < str1.length ;k++) {
if(str1[i+k]!=str[j+k])
break;
}
if(k>max)
max = k;
}
}
print(max);
您编辑的解决方案涵盖了更多的问题,但对于中心位置的字符串仍然不是完美的,原因与贪婪不同于DP
检查:-
str1 = "sbsringada";
str2 = "cdssringasd";
int max = 0;
for(int i=0;i<str1.length,i++) {
for(int j=0;j<str2.length;j++) {
int k = 0;
for(;j+k<str2.length && i+k < str1.length ;k++) {
if(str1[i+k]!=str[j+k])
break;
}
if(k>max)
max = k;
}
}
print(max);
正确的ans是6
,也就是“sringa”
,但代码输出5
。原因是它在str2中的“sringa”之前的“s”处变得贪婪
编辑:-
str1 = "sbsringada";
str2 = "cdssringasd";
int max = 0;
for(int i=0;i<str1.length,i++) {
for(int j=0;j<str2.length;j++) {
int k = 0;
for(;j+k<str2.length && i+k < str1.length ;k++) {
if(str1[i+k]!=str[j+k])
break;
}
if(k>max)
max = k;
}
}
print(max);
这将永远持续下去,你将给出一个代码,我将给出它不起作用的地方,除非你没有找到真正的野蛮算法或证明你的代码在数学上是正确的
由于您还没有证明,我将给您实际的暴力代码,我曾经为同一个问题编写过。理解起来非常简单直观,但效率很低
伪代码:-
str1 = "sbsringada";
str2 = "cdssringasd";
int max = 0;
for(int i=0;i<str1.length,i++) {
for(int j=0;j<str2.length;j++) {
int k = 0;
for(;j+k<str2.length && i+k < str1.length ;k++) {
if(str1[i+k]!=str[j+k])
break;
}
if(k>max)
max = k;
}
}
print(max);
int max=0;
对于(int i=0;你发布的链接说这个问题可以用后缀树来解决,所以不需要DP。但是你可以直观地看到,使用上面的方法O(mn)是可能的(尽管我可能搞砸了一些作业)。如果我一次从字符串1中提取一个字符,然后查看字符串2中子字符串的最大长度是多少,然后取字符串1中所有字符的最大长度。现在,检查字符串1中某个字符的最大子字符串的复杂性是字符串2的大小。因此,对于字符串1中的m个字符,它将是字符串2的msize。我认为是y你把这个问题搞混了。@GeoAoe不是我没有看到我的例子