lsmCC 发表于 2023-10-22 18:26:43

为什么不对呢

// 思路如下:1.for枚举后缀长度,设为n;
// 2.枚举所有字符串(除了第一个字符外)
// 3.for(枚举str与str的n个字符是否相等,相等则找到了n;不想等则继续缩小n的范围 )



#include <bits/stdc++.h>
using namespace std;
const int N =200;
string a;
int n;
int main()
{
    int len=1000;
    while(cin>>n,n)
    {
         for(int i=0;i<n;i++)
         {
             cin>>a;
             if(len>a.size()) len=a.size();
         }
         
         
    while(len)
    {
      bool success =true;
      for(int i=1;i<n;i++)
      {
            bool is_same =true;
            for(int j=1;j<=len;j++ )
            {
                if(a.size()-j]!=a.size()-j])
                {
                  is_same = false ;
                  break;
                }
      
            }
            if(!is_same)
            {
                success = false;
                break;
            }
         
      }
      if(success)break;
      len--;
    }
    cout<<a.substr(a.size()-len)<<endl;
}
   
}
当样例为
3
baba
aba
cba
2
aa
cc
2
aa
a
0
为什么只输出
ba


而不输出最后一个a呢
输出的正确答案为
ba

a

陶远航 发表于 2023-10-22 18:27:05

这个问题的关键在于你的代码是寻找所有输入字符串的最长公共后缀。你的代码从最长可能的后缀长度开始,然后逐渐减小长度,直到找到一个长度,使得所有字符串的这个长度的后缀都相同。

在你给出的样例中:

3
baba
aba
cba
2
aa
cc
2
aa
a
0

对于第一个样例,\"baba\",\"aba\",和 \"cba\" 的最长公共后缀是 \"ba\",而不是 \"a\"。因为虽然所有字符串都以 \"a\" 结尾,但是 \"ba\" 是所有字符串都有的最长后缀。

对于第二个样例,\"aa\" 和 \"cc\" 没有公共后缀,所以没有输出。

对于第三个样例,\"aa\" 和 \"a\" 的最长公共后缀是 \"a\"。

最后一个 \"0\" 是输入结束的标志,所以没有对应的输出。

所以,你的代码的输出是正确的。

如果问题已经解决,请设置最佳答案

isdkz 发表于 2023-10-22 18:27:28

这段代码的目的是找到给定字符串数组中,所有字符串的共同后缀。在这段代码中,它首先读取输入的整数n,表示字符串数组中的字符串数量。然后,它循环n次,读取每个字符串并计算最小长度len。接下来,它使用一个while循环来逐渐缩小len的值,直到找到所有字符串的共同后缀。

问题出在这个while循环的逻辑上。在每次循环中,它首先将success标志设置为true。然后,它通过一个嵌套的for循环来比较字符串数组中的每个字符串的后缀。如果有任何一个字符串的后缀与第一个字符串的后缀不相等,那么is_same标志将被设置为false。但是,这里有一个问题,即在比较字符串后缀时,它只比较了len个字符。这意味着如果两个字符串的后缀长度小于len,则无法正确比较它们的后缀。这也是为什么最后一个测试样例中的最后一个字符"a"没有被输出的原因。

为了修复这个问题,我们需要修改内部的for循环。我们可以使用min函数来确定两个字符串后缀的最小长度,然后在比较时使用这个最小长度。这样,即使有一个字符串的后缀长度小于len,我们仍然可以正确比较它们。修改后的代码如下:

while (len) {
    bool success = true;
    for (int i = 1; i < n; i++) {
      bool is_same = true;
      int min_len = min(len, (int)a[ i].size());
      for (int j = 1; j <= min_len; j++) {
            if (a.size() - j] != a[ i].size() - j]) {
                is_same = false;
                break;
            }
      }
      if (!is_same) {
            success = false;
            break;
      }
    }
    if (success) break;
    len--;
}


通过这个修改,最后一个字符"a"也会被正确输出。

Mike_python小 发表于 2023-10-22 18:27:51

经过观察发现,该程序在找最长公共后缀的过程中没有考虑到所有字符串都只有一个字符的特殊情况。

为了解决这个问题,我们可以在每一段查找前检查字符串长度是否合法,如果长度不足则将长度缩小到1,防止程序出现错误。修改后的代码如下:


#include <bits/stdc++.h>
using namespace std;
const int N =200;
string a;
int n;

int main() {
    while(cin>>n, n) {
      int len=1000;
      for(int i=0; i<n; i++) {
            cin>>a;
            if(len>a.size()) len=a.size();
      }
      while(len) {
            bool success =true;
            for(int i=1; i<n; i++) {
                bool is_same =true;
                for(int j=1; j<=len && is_same; j++) {// 修改此处,当长度不足时将长度缩小到1
                  int a_ = a.size()-j;
                  int b_ = a.size()-j;
                  if(a_ < 0 || b_ < 0 || a != a) {
                        is_same = false;
                  }
                }
                if(!is_same) {
                  success = false;
                  break;
                }
            }
            if(success) break;
            len--;
      }
      cout<<a.substr(a.size()-len)<<endl;
    }
    return 0;
}


希望我的回答能够帮助到你,如有疑问请继续追问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 为什么不对呢