2017-01-30 2 views
2

Я хочу иметь функцию, которая вернет true тогда и только тогда, когда char * s может быть получен из char * t, просто пересекая определенные буквы, например. g("ERT", "EAARYT")=true и g("ERT","ABCT")=false.Один символ из другой функции bool

Моя идея для этого кода является следующее:

bool g(char* s, char* t) { 
    for (int i=0; s[i]!=0;i++) { 
     for (int j=i; t[j]!=0; j++) { 
      if (s[i]==t[j]) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 

Очевидно, что это не работает, как это только проверить, является ли первая буква присутствует, а затем сразу же возвращает истину. Как мне это изменить?

Я бы предпочел использовать вложенные петли/если конструкции это должно быть более чем выполнимо с этим.

+0

не работает должным образом тогда. – Mrowkacala

+1

Считаете ли вы, что вы не сразу возвращаетесь? – user2079303

+0

Также используйте один цикл. Присвоение 'i' to' j' неверно. – LogicStuff

ответ

3

return true тогда и только тогда, когда char * s можно было бы получить из char * t путем простого вычеркивания определенных букв. Это означает две вещи:

  • [A] t должен содержать все символы s. Поэтому нам нужно сохранить количество символов.
  • [B] t должен содержать все символы s, а также t должен иметь общие символы в том же порядке, что и s.

Раствор А: Порядок символов в t не имеет значения. Важно то, что все символы в s должны присутствовать в t.

g("ERRT", "ERT") = false

g("ERRR", "ERRT") = false

g("ERRR", "RRRE") = true

bool g(char* s, char* t) 
{ 
    int hash[256] = {0}; 
    int i; 
    for(i = 0; t[i]; ++i) 
    { 
     hash[t[i]] += 1; 
    } 

    for(i = 0; s[i]; ++i) 
    { 
     if(hash[s[i]] <= 0) 
     { 
      return false; 
     } 
     else 
     { 
      hash[s[i]] -= 1; 
     } 
    } 

    return true; 
} 

Раствор Б: Порядок символов в tделает дело. Также все символы в s должны присутствовать в t.

g("ERRT", "RERT") = false

g("ERRR", "RRER") = false

g("ERRR", "RRRE") = false

г ("ERTR", "R IS GR Т Б R") = True

bool g(char* s, char* t) 
{ 
    if(strcmp(LCS(s, t), s) == 0) 
    { 
     return true; 
    } 

    return false; 
}  

в другом месте, LCS(s, t) =Longest Common Subsequence

0

Вы можете сделать это как-

bool g(char* s, char* t){ 
    int sLen=strlen(s); 
    int tLen=strlen(t); 
    if(sLen > tLen) 
    { 
     return false; 
    } 

    int j=0; 
    for(int i=0;i<tLen;i++) 
    { 
     if(s[j] == t[i]) 
     { 
      j++; 
     } 
     if(j == sLen) 
     { 
      return true; 
     } 
    } 
    return false; 
} 
+0

Предполагается, что '' '' '' '' '' 'сортируются персонажами внутри них? – P0W

0

Попробуйте это:

int c = 0; 
    int len = strlen(s); // Find the length of string 
    for(i=0; s[i]!=0;i++) 
    { 
      for(j=0; t[j]!=0; j++) 
      { 
        if(s[i]==t[j]) 
        { 
          c++; // count the character, If count is equal to length then true. 
        } 
      } 
    } 
    if (len == c) 
      return true; 
    else 
      return false; 
+0

if (len> = c) return true; – user1438832

+0

@ user1438832 количество экземпляров равно длине, не более или менее. – rsp

+1

жаль, что вы правы. – user1438832

1

Вы можете вернуться с false, если последний не будет найден, в противном случае получится:

bool g(const char* s, const char* t) { 
    for (int i = 0; s[i] != 0; i++) { 
    bool found = false; 
    for (int j = i; t[j] != 0; j++) { 
     if (s[i] == t[j]) { 
     found = true; 
     } 
    } 
    if (!found) { 
     return false; 
    } 
    } 
    return true; 
} 

Также , рассмотрите возможность использования strspn для подсчета совпадающих символов

bool g(const char* s, const char* t){ 
    return strspn(s, t) == strlen(s); 
} 
bool g(const char* s, const char* t){ 
    return strspn(s, t) == strlen(s); 
} 
+0

интересно, но будет ли 'strcpn' работать с непоследовательным совпадением, как в этом вопросе? – artm

+0

@artm да, похоже. http://coliru.stacked-crooked.com/a/d9619f380a0decb7 – pergy

0

Я хотел бы написать функцию перенапрягает только одну петлю и подставляя вторую петлю стандартной функции C strchr. Например

#include <iostream> 
#include <iomanip> 
#include <cstring> 

bool g(const char *s, const char *t) 
{ 
    size_t m = std::strlen(s); 
    size_t n = std::strlen(t); 

    const char *p; 

    while ((m != 0) and not (n < m) and (p = std::strchr(t, s[0]))) 
    { 
     ++p; 
     n -= p - t; 
     t = p; 
     --m; 
     ++s; 
    } 

    return m == 0; 
} 

int main() 
{ 
    std::cout << "g(\"ERT\", \"EAARYT\") = " 
       << std::boolalpha << g("ERT", "EAARYT") << std::endl;  

    std::cout << "g(\"ERT\", \"ABCT\") = " 
       << std::boolalpha << g("ERT", "ABCT") << std::endl;  
} 

Выход программы

g("ERT", "EAARYT") = true 
g("ERT", "ABCT") = false