0

Rails を学んだので、Ruby の知識を広げたいと思っています。そこで、Ruby で C++ の演習を行っています。具体的には、文字列に部分文字列が存在するかどうかを確認する必要があります。もしそうなら、開始インデックスを返す必要があります。存在しない場合は -1 を返します。C++ に非常によく似た Ruby ソリューションを思いついたのですが、Ruby に「より優れた」より慣用的なソリューションがあるかどうか疑問に思っていました。

C++

int find(char str[], char sub_str[])
{
  int str_length = strlen(str);
  int sub_str_length = strlen(sub_str);
  bool match = false;

  for(int i=0; i<str_length; i++)
  {
    if(str[i] == sub_str[0])
    {
      for(int j=1; j<sub_str_length; j++)
      {
        if(str[i+j] == sub_str[j])
          match = true;
        else
        {
          match = false;
          break;
        }
      }
      if(match)
        return i;
    }
  }
  return -1;
}

ルビー

def find_sub_str(str, sub_str)
  match = false
  for i in 0...str.length
    if str[i] == sub_str[0]
      for j in 1...sub_str.length
        if str[i+j] == sub_str[j]
          match = true
        else
          match = false
          break
        end
      end
      if match == true
        return i
      end
    end
  end
  return -1
end
4

3 に答える 3

4

のindexメソッドを使用できますString。これはnil、-1 を返すよりも慣用的な Ruby です。

 "SubString".index("String") # -> 3
 "SubString".index("C++") # -> nil

この動作が本当に必要な場合は、nil に対して -1 を返すテストでラップできます。

于 2013-07-15T21:02:15.577 に答える
2
  1. forRuby では使用しないでください。呼び出すだけでeachスコープを導入しません。とfor i in 0...str.lengthなり(0...str.length).each do |i|ます。

  2. 高階関数はあなたの友達です!each_cons&を使用するとfind_index、物事がはるかにきれいになります ( Enumerableを調べてください。多くの便利なメソッドの本拠地です)。

    def find_sub_str(str, sub_str)
      str.chars.each_cons(sub_str.length).find_index do |s|
        s.join == sub_str
      end
    end
    
    find_sub_str('foobar', 'ob')  #=> 2
    
  3. Ruby コアの:index :)

    'foobar'.index('ob')  #=> 2
    

#2 と #3 は両方とも、一致しない場合はnilではなくを返します。Ruby では falsey で-1あるため、これが最適です。nil

于 2013-07-15T21:06:25.413 に答える
0
#how if we use this solution, it gets the job done in O(n)    

given_string = "Replace me with your code!"

chars_given_string = given.split('')

chars_of_substr = "ith".split('')

is_substr = false
ptr = 0

char_given.each do |i|
    if ( i == substr[ptr])
       ptr += 1
    else
       ptr = 0
    end
    is_substr = true if ptr == substr.length
    break if ptr == substr.length
end

puts is_substr
于 2014-02-16T09:17:14.873 に答える