字符串中的子字符串

时间:2018-07-23 03:38:27

标签: ruby

此函数应使用两个字符串“ daBcD”和“ ABC”。它试图从“ a”中的字母创建字符串“ b”。您只能删除或大写字母,不能更改它们。 b将始终包含所有大写字母。

def abbreviation(a, b)
aArray = a.split('')
idx = 0
aArray.each do |char|
    #print "char: #{char}\n"
    #print "Before loops: #{aArray}\n"
    if char.casecmp(b[idx]) == 0
        char.upcase!
        idx += 1
        #print "char: #{char}\nArry: #{aArray}\n"
        #print "idx: #{idx}\n siz: #{b.size}\n"
        if idx == b.size
            aArray.reject! {|i| i == 'delete'}
            aArray.slice!(b.size)
            break
          end
    else
      aArray[aArray.index(char)] = 'delete'
      #print "deleted, now is: #{aArray}\n"
    end
  end
  res = aArray.join('')
  if res == b
    return 'YES'
  else
    return 'NO'
  end
end

这适用于几个测试用例,但大多数失败。有人可以描述更好的方法吗?

2 个答案:

答案 0 :(得分:1)

我假设问题在于确定>Python 2.7.14 |Anaconda, Inc.| (default, Nov 8 2017, 13:40:45) [MSC v.1500 64 bit (AMD64)] Type "copyright", "credits" or "license" for more information. >File "C:/Users/hpinko/Desktop/python scripts/game.py", line 1, in <module> import pygame ImportError: No module named pygame 中的字符是否以与b中相同的顺序出现在a中(大小写无关),但不一定在{ {1}}(请参见下面的第二个示例)。如果有,我将返回它们在b中出现的索引数组。如果没有匹配项,则返回a

a

对于第一个示例,正则表达式如下。

nil

答案 1 :(得分:0)

绝对简单的方法是通过正则表达式:

def abbreviation(a, b)
  re = Regexp.new(b.each_char.map(&Regexp.method(:quote)).join('.*'), Regexp::IGNORECASE)
  !!re.match(a)
end

abbreviation("daBcD", "ABC")
# => true
abbreviation("daCbD", "ABC")
# => false

对于输入ABC,我们将构造一个正则表达式/A.*B.*C/i,然后针对它测试另一个字符串。 .*构造将说明“删除”; IGNORECASE选项用于“大写”。

编辑:如果问题进一步受到限制,如注释所建议,只能删除小写字母,

def abbreviation(a, b)
  # (b is uppercase only)
  re_pat = b.each_char.map { |c| "[#{c}#{c.downcase}]"}.join('[[:lower:]]*')
  re = Regexp.new(re_pat)
  !!re.match(a)
end

p abbreviation("daBcD", "ABC") # => true
p abbreviation("daBdcD", "ABC") # => true
p abbreviation("daBDcD", "ABC") # => false