【问题标题】:C: How to find that a certain number of characters are present in a string in any sequence?C:如何找出某个字符串中任意序列中存在一定数量的字符?
【发布时间】:2019-06-02 12:58:02
【问题描述】:

所以给定的任务是创建一个函数来检查任何字符串 if

  1. 包括所有 5 个字母“a”、“b”、“c”、“d”和“e”(在任何 序列)和
  2. 字符串“abcde”是给定字符串的子字符串。 如果 1 成立(但 2 不成立),则返回 1。 如果 1 和 2 都成立,则返回 2。 否则,返回 0。

例子:

checkabcde(“someaxbxcxdxemm”) -> 1
checkabcde(“someOtherValue”) -> 0
checkabcde(“xyabcdeping”) -> 2
checkabcde(“someaxuxdxlxammabcde”) -> 2

在我的方法中,我已经能够发现子字符串是“abcde”,但无法确定该字符串是否包含“a”、“b”、“c”、“d”、“e”序列

int checkabcde(char str[]) {

  char str2[] = {
    'a',
    'b',
    'c',
    'd',
    'e'
  };

  char str3[5]; //to be filled with elements from str2 when found inconsecutive order

  int i, z, x, f;

  z = 0; //position for str3
  f = 0; //flag for similarity comparison of str2 and str3

  for (i = 0; i < strlen(str); i++) {
    for (x = 0; x < strlen(str2); x++) {
      if (str[i] == str2[x]) {

        if ((str[i] == 'a') && (str[i + 1] == 'b') && (str[i + 2] == 'c') && (str[i + 3] == 'd') && (str[i + 4] == 'e')) {
          return 2;
        } else {

          if (str3[z] != str[z - 1]) {
            str3[z] = str2[x];
            z++;
          }

        }

      }
    }
  }

  for (i = 0; i < 5; i++) {
    for (x = 0; x < 5; x++) {
      if (str2[i] == str3[x]) {
        f++;
      }
    }
  }

  if (f == 5) {
    return 1;
  } else if (f1 == 0) {
    return 0;
  }
}

编辑:不允许使用指针

【问题讨论】:

  • 迭代和计数字符?对字母长度进行计数,并为遇到的每个字符增加计数。然后检查感兴趣的。然后通过删除不需要的计数器来优化它...
  • 你可以使用strchrstrstr吗?

标签: c string loops substring


【解决方案1】:
  1. 对于 1,您可以使用f[256] 设置f[ch] = 1 用于s1 中的所有字符,然后检查f[ch] == 1 是否用于s2 中的每个字符
  2. 对于 2,您可以使用 strstr() 参见 http://man7.org/linux/man-pages/man3/strstr.3.html

以下code 可以工作:

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

int check(const char* s1, const char* s2) {
  int f[256];
  memset(f, 0, sizeof(f));

  // check 1
  for (int i = 0; s1[i] != '\0'; ++i)
    f[s1[i]] = 1;
  for (int i = 0; s2[i] != '\0'; ++i)
    if (f[s2[i]] == 0)
      return 0;
  // check 2
  return strstr(s1, s2) == NULL ? 1 : 2;
}

int main(void) {
  printf("%d\n", check("someaxbxcxdxemm",      "abcde"));
  printf("%d\n", check("someOtherValue",       "abcde"));
  printf("%d\n", check("xyabcdeping",          "abcde"));
  printf("%d\n", check("someaxuxdxlxammabcde", "abcde"));
  return 0;
}

【讨论】:

    【解决方案2】:

    除了查找子字符串之外,您还可以使用单独的结构来检查单个字符。

    一个由五个布尔值组成的数组可用于存储每个字符的当前状态。例如:

    bool chars[5] = {false};
    
    for (int i = 0; i < strlen(str); i++) {
        char c = str[i];
        switch(c) {
            case 'a':
                chars[0] = true;
                break;
            case 'b':
                chars[1] = true;
                break;
            // include cases for each character you are looking for
        }
    }
    

    如果最后chars 数组中的每个条目都为真,则您知道该字符串包含所有字符。

    除了你已经在做的匹配子字符串之外,你还可以这样做。

    您可能还想查看some other methods 检查字符串是否包含某个子字符串。

    【讨论】:

      【解决方案3】:

      试试这样的:

      int checkabcde(char str[]) {
      
          // Check if string contains substring "abcde"
          if (strstr(str, "abcde") != NULL) {
              return 2;
          }
      
          int charCounts[5] = {0, 0, 0, 0, 0};
          int length = strlen(str);
          int i = 0;
      
          // Keep counts of each occurrence of a,b,c,d,e
          for(; i < length; i++) {
              // If "abcde" contains the current character
              if (strchr("abcde", str[i]) != NULL) {
                  charCounts[str[i] - 'a']++;
              }
          }
      
          i = 0;
      
          // Check if any of the counts for a,b,c,d,e are 0
          for (; i < 5; i++) {
              if (charCounts[i] == 0) {
                  return 0;
              }
          }
      
          // Otherwise we must have found at least 1 of each a,b,c,d,e
          return 1;
      }
      

      【讨论】:

        【解决方案4】:

        str 中的每个索引处,sub 循环查找子字符串匹配。如果找到,则返回 2。 found 循环查看该字符 str[index] 是否是 abcde 之一。如果是,则将check 数组中的匹配索引设置为空格。
        在处理完str 中的所有字符后,将abcdecheck 进行比较。如果匹配,则 str 中缺少该匹配字符。返回 0。

        #include <stdio.h>
        #include <string.h>
        
        int checkabcde ( char str[]) {
            char abcde[] = "abcde";
            char check[] = "abcde";
            int index = 0;
            int match = 1;
            int length = strlen ( str);
            int span = strlen ( abcde);
        
            while ( str[index]) {
                if ( str[index] == abcde[0]) {
                    match = 1;
                    for ( int sub = 0; sub < span; ++sub) {
                        if ( index + sub > length || str[index + sub] != abcde[sub]) {
                            match = 0;
                            break;
                        }
                    }
                    if ( match) {
                        return 2;
                    }
                }
                for ( int found = 0; index + found < length && found < span; ++found) {
                    if ( str[index + found] == abcde[found]) {
                        check[found] = ' ';
                    }
                }
                index++;
            }
            for ( int found = 0; found < span; ++found) {
                if ( check[found] == abcde[found]) {
                    return 0;
                }
            }
            return 1;
        }
        
        int main( void) {
            char lines[][30] = {
                "someaxbxcxdxemm"
                , "someOtherValue"
                , "xyabcdeping"
                , "someaxuxdxlxammabcde"
                , "vu4ndljeibn2c9n@aiendjba"
                , "dbcaeddeaabcceabcde"
            };
        
            for ( int each = 0; each < 6; ++each) {
                printf ( "for [%s] result = %d\n", lines[each], checkabcde ( lines[each]));
            }
            return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 2023-01-23
          • 2014-11-27
          • 2014-08-12
          • 2015-02-18
          • 2020-03-19
          • 1970-01-01
          • 2016-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多