小黄练编程 发表于 2021-12-16 21:48:10

求一句英语中的最长一段单词,例eesssccccc输出cccccc

本帖最后由 小黄练编程 于 2021-12-17 13:21 编辑

#include<stdio.h>
#include<string.h>
main()
{
        int n,i,c=0,maxlen,len;
        char s,b,j;
        gets(s);
        n=strlen(s);
        len=0;
        for(i=0;i<n;i++)
        {
               
                if(s!=s)//s为s【i】
                {
                        len=i-len;
                j=i;//想法,将每段开头位子,设为一个元素,保存在数组j[]中,感觉这里出了问题,不会将每段开头,i值保存下来。
                  b=len;//上同。
                  c++;
                }
        }
        maxlen=b;
        for(i=0;i<c;i++)
        {
                if(b>maxlen)//b为b【i】
                        maxlen=b;//这里b是b【i】,
        }
    printf("maxlen=%d\n",maxlen);
        for(i=0;i<c;i++)
        {
                if(j-j==maxlen)//想法:求出开头位置。
                {
                        for(i=j;i<j+maxlen;i++)
                  printf("%c",s);//s为s【i】
                }
        }
}
{:10_266:} {:10_266:} {:10_266:} 数不出结果。

傻眼貓咪 发表于 2021-12-16 22:21:03

#include <stdio.h>
#include <string.h>

int main(){
    char str, res = {0}, c = '\0';
    int n = 0;
   
    fgets(str, 256, stdin);
    int N = strlen(str);
    str[(N--)-1] = '\0';
   
    for(int i = 0; i < N; i++){
      if(i == N-1 && c == str) res[(int)c] = ++n > res[(int)c] ? n : res[(int)c];
      else if(c == str) n++;
      else{
            res[(int)c] = n > res[(int)c] ? n : res[(int)c];
            n = 1;
            c = str;
      }
    }
   
    n = 0; c = '\0';
    for(int i = 0; i < 256; i++) if(res > n) n = res;
   
    printf("%c", c);
}

小黄练编程 发表于 2021-12-17 12:24:05

傻眼貓咪 发表于 2021-12-16 22:21


{:10_266:}{:10_266:}只能输出最长那串的一个字母,并不能输出一整串。最要命的是,我是学的真的少,连完全看明白都费劲,{:10_266:}{:10_266:}{:10_266:},我复制时这里说错了,把后面for的int删了才有用。{:10_266:}{:10_266:}{:10_266:}{:10_266:}{:10_266:}

傻眼貓咪 发表于 2021-12-17 12:37:29

小黄练编程 发表于 2021-12-17 12:24
只能输出最长那串的一个字母,并不能输出一整串。最要命的是,我是学的真的少,连完 ...

我以为你是想要输出一个字符{:10_258:},如果想输出最长相同字符的子字符串代码改一点就好了:#include <stdio.h>
#include <string.h>

int main(){
    char str, res = {0}, c = '\0';
    int n = 0;
   
    fgets(str, 256, stdin);
    int N = strlen(str);
    str[(N--)-1] = '\0';
   
    for(int i = 0; i < N; i++){
      if(i == N-1 && c == str) res[(int)c] = ++n > res[(int)c] ? n : res[(int)c];
      else if(c == str) n++;
      else{
            res[(int)c] = n > res[(int)c] ? n : res[(int)c];
            n = 1;
            c = str;
      }
    }
   
    n = 0; c = '\0';
    for(int i = 0; i < 256; i++) if(res > n) n = res;
   
        char ans;
        for(int i = 0; i < n; i++)
        ans = c;
       
    printf("%s", ans);
}

小黄练编程 发表于 2021-12-17 12:56:53

傻眼貓咪 发表于 2021-12-17 12:37
我以为你是想要输出一个字符,如果想输出最长相同字符的子字符串代码改一点就好了:

{:10_266:}{:10_266:}{:10_266:}那你感觉我上面思路错的很离谱吗?

傻眼貓咪 发表于 2021-12-17 13:04:19

我不知道会不会离谱,但代码千百种,不同的程序员思路各不同,没有对或错,这题有我能解答,下一题有可能你能解答,而我不能,这是因为每个人的思路不同,所以需要多做、多看。(这样就能累积经验,所谓的经验,就是思路。自己一个人思路有限,一万个人的思路是无限的)

小黄练编程 发表于 2021-12-17 13:23:19

傻眼貓咪 发表于 2021-12-17 13:04
我不知道会不会离谱,但代码千百种,不同的程序员思路各不同,没有对或错,这题有我能解答,下一题有可能你 ...

我刚改了,但还是输不出结果,{:10_266:}{:10_266:}{:10_266:}{:10_266:}

如来神掌 发表于 2021-12-17 16:43:12

我的会是这样:
#include<stdio.h>
#include<string.h>

int main()
{
    int input_len,len = 1,max_len = 1;
    char flag = '\0',target = '\0';
    char input = {0};

    fgets(input,256,stdin);
    input_len = strlen(input);

    for(int i = 0;i < input_len;i++)
    {
      flag = input;
      if (flag == input)
      {
            len++;
            if(len > max_len)
            {
                max_len = len;
                target = flag;
            }
      }else{
            len = 1;
      }
    }

    for(int j = 0;j < max_len;j++)
    {
      printf("%c",target);
    }
    printf("\n");

    return 0;
}
你看看是否对你有帮助:我这里是取巧了,遍历原字符串的每一个字符,当遇到更长的同字符串时,就更新对应的字符和长度

小黄练编程 发表于 2021-12-17 17:49:28

本帖最后由 小黄练编程 于 2021-12-17 17:51 编辑

如来神掌 发表于 2021-12-17 16:43
我的会是这样:

你看看是否对你有帮助:我这里是取巧了,遍历原字符串的每一个字符,当遇到更长的同字符 ...

偶买噶,我人麻了,我想了老半天才发现,你这target是代表最长一段中一个字母,然后循环输出。{:10_266:}{:10_266:}{:10_266:},我还以为是个数组,在想怎么回事。

小黄练编程 发表于 2021-12-17 17:53:29

如来神掌 发表于 2021-12-17 16:43
我的会是这样:

你看看是否对你有帮助:我这里是取巧了,遍历原字符串的每一个字符,当遇到更长的同字符 ...

为何前面要加flag=‘0’,tagert=‘0’,可以删了吗?{:10_266:}{:10_266:}。

小黄练编程 发表于 2021-12-17 18:46:19

如来神掌 发表于 2021-12-17 16:43
我的会是这样:

你看看是否对你有帮助:我这里是取巧了,遍历原字符串的每一个字符,当遇到更长的同字符 ...

谢谢,搞懂了{:10_266:}{:10_266:}{:10_266:}{:10_266:}{:10_286:}

如来神掌 发表于 2021-12-20 09:52:21

本帖最后由 如来神掌 于 2021-12-20 09:53 编辑

小黄练编程 发表于 2021-12-17 17:53
为何前面要加flag=‘0’,tagert=‘0’,可以删了吗?。

其实这是为了清空对应的变量内容,不加也是可以的,最好是加上,因为这样可以在系统分配内存的时候清空原本有可能在该存储空间中的未清除干净的无用数据,同时我用的是'\0',不是‘0’,你看看ASCII码表就知道了。
页: [1]
查看完整版本: 求一句英语中的最长一段单词,例eesssccccc输出cccccc