来自另一个bool函数的一个char

时间:2017-01-30 12:05:22

标签: c++ loops if-statement for-loop

我希望有一个函数将返回true,当且仅当char * s可以通过简单地跨越某些字母从char * t获得时,例如g("ERT", "EAARYT")=trueg("ERT","ABCT")=false

我对此代码的想法如下:

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;
}

显然它不起作用,因为它只检查第一个字母是否存在然后立即返回true。 我该怎么改变呢?

我更喜欢使用嵌套循环/如果构造它应该比那更可行。

5 个答案:

答案 0 :(得分:3)

返回true,当且仅当char * s可以通过简单地跨越某些字母从char * t获得。这意味着两件事:

  • [A] t应包含s的所有字符。因此,我们需要存储字符数。
  • [B] t应包含s的所有字符以及t应具有与s相同的常用字符。

解决方案A: 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;
}

解决方案B: t 中的字符顺序很重要。此外,s中的所有字符都应出现在t

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

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

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

g(“ ERTR ”,“R ER GR T B 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

答案 1 :(得分: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);
}

答案 2 :(得分: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;
}

答案 3 :(得分:0)

试试这个:

public void MoveToTop(ListBox lb, int index) {
    var item = lb.Items[index];
    lb.Items.RemoveAt(index);
    lb.Items.Insert(0, item);
    lb.Refresh();
}

public void MoveToBottom(ListBox lb, int index) {
    var item = lb.Items[index];
    lb.Items.RemoveAt(index);
    lb.Items.Add(item);
    lb.Refresh();
}

答案 4 :(得分: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