在字符串回文中查找缺少的字符

时间:2017-08-26 16:50:39

标签: c algorithm

以下是我为了找到字符串回文中缺少的字符而编写的代码,但我不知道在同时检查两边的字符串时如何找到必须打印的字符。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char s[100], m[100];
    fgets(s, 100, stdin);
    int len = strlen(s);
    int a, b;

    for (int i = 0; i < strlen(s); i++) {
        m[i] = s[len - i - 1];
    }

    for (int i = 0, j = 0; i <= strlen(s), j <= strlen(s); i++, j++) {
        if (isspace(m[j])) {
            j++;
        }
        if (s[i] != m[j]) {
            if (len % 2 == 0) {
                printf("%c", m[j]);
                break;
            } else {
                printf("%c", s[i]);
                break;
            }
        }  
    }
}

输入:Malayaam
输出:l

输入:abcddcb
输出:a

4 个答案:

答案 0 :(得分:2)

假设回文中始终存在一个错误,我建议查看每一行的下一个字母,以确定哪两个不相同的字母是丢失的。

代码:

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

int main(void)
{
    char s[100],m[100];
    fgets(s,100,stdin);
    int len=strlen(s)-1;
    int i,j;


    for(i=0;i<len;i++)
    {
        m[i]=tolower((unsigned char)s[len-i-1]);
        s[i]=tolower((unsigned char)s[i]);
    }

    for(i=0,j=0;i<len;i++,j++)
    {
        if(s[i]!=m[j])
        {
            printf("%c != %c, ", s[i], m[j]);
            if(s[i+1]==m[j])
            { printf("but %c == %c, %c should be inserted on the right.\n", s[i+1], m[j], s[i]);
            } else if(s[i]==m[j+1])
            { printf("but %c == %c, %c should be inserted on the left.\n", s[i], m[j+1], m[j]);
            } else
            { printf("giving up.\n");
            }
            break;
        }
    }

    return 0;
}

注意:

  • 我将mch及后来的chqrlie和chux
  • 的评论纳入其中
  • 我添加了所有输入的小写,以防止&#34; m&#34;!=&#34; M&#34; in&#34; Malayaam&#34;
  • 我认为你的[mcve]并不完整,所以我编辑了一些内容。
  • 为了向后兼容旧版C,我编辑了一点 (例如,for循环头内没有声明i)。
  • 假设只有一个错误可以防止某些边缘情况

答案 1 :(得分:2)

通过识别输入可能具有不需要参与测试的尾随'\n'来减少问题。

#include <ctype.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

int main(void) {
  char s[100];
  fgets(s, sizeof s, stdin);
  s[strcspn(s, "\r\n")] = '\0';
  size_t len = strlen(s);

当字符串由于1“额外”字符而不是回文时,删除左或右字符可能无法辨别,直到剩余字符串的相当大量的处理。代码需要考虑2条路径。

  size_t mismatch;
  if (is_palindrome(s, len, &mismatch)) {
    puts("Palindrome");
  } else if (is_palindrome(s + mismatch + 1, len - mismatch*2 - 1, NULL)) { // skip left
    printf("left <%c>\n", s[mismatch]);
  } else if (is_palindrome(s + mismatch, len - mismatch*2 - 1, NULL)) { // skip right
    printf("right <%c>\n", s[len - mismatch-1]);
  } else {
    puts("Not palindrome nor off by 1 palindrome");
  }
}

剩下的就是制作is_palindrome()

bool is_palindrome(const char *s, size_t len, size_t *mismatch) {
  printf("<%s> %zu\n", s, len);
  size_t i = 0;
  while (i + 1 < len) {
    if (tolower((unsigned char)s[i]) != //
        tolower((unsigned char )s[len - 1])) {
      if (mismatch) {
        *mismatch = i;
      }
      return false;
    }
    i++;
    len--;
  }
  return true;
}

答案 2 :(得分:0)

int i;
char s[100];
scanf("%[^\n]s",s);
int l=strlen(s);
for(i=0,j=l-1;i<l,j>=0;i++,j--)
{
     if(s[i]!=s[j])
     {
          if(s[i+1]==s[j])
          {
              printf("%c",s[i]);
              break;
          }
          else
          {
              printf("%c",s[j]);
              break;
          }
     }
}

/*find the missing letter in palindrome:

此代码检查字符串的第一个i和最后一个字符j,如果相等,则i递增,j递减。如果不相等,则检查i或j旁边的字符是否与该字符相等,如果i + 1等于j,则i丢失;而当j-1等于i时,j是字符串回文中的丢失字符。* /

答案 3 :(得分:0)

希望这对您有所帮助。

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

int main(void)
{
char ar[102];
int ai=0;
int aj,ak;
scanf("%s",&ar);
ak = strlen(ar)-1;
ai = 0;
while(ai<ak){
    if(ar[ai]!=ar[ak]){
        if(ar[ai] == ar[ak-1] && ai!=ak-1){
            printf("%c",ar[ak]);
            break;
        }else{
            printf("%c",ar[ai]);
            break;
        }
    }
    ak--;
    ai++;
}
}