2014-06-19 3 views
0

이것은 코딩 문제에서 저에게 묻 혔고, 일종의 추악한 솔루션을 제공했습니다. 이 질문에 대한 주인님의 아름다운 해결책을보고 싶어합니다. 변경 문자의 대문자로 모든 변형 문자열의 배열을 반환, 문자와 숫자, 즉 "abCd1_k"을 포함하는 문자열, 즉, ​​"AbCd1_k", "ABcd1_k" .... 다음대문자와 소문자로 된 문자열의 가능한 모든 변형

더 간단한 문제의 경우 '주어

그것도 가장 아름다운 솔루션이 여전히있을 것이라는 점을 나에게 보인다 - '[AB', 'Ab의', 'AB' 'AB'] AbCd1_k은>

반환해야합니다, 'AB'것 ' 값 비싼 시간 복잡성. (최악의 경우, 각 캐릭터에 대해 2 가지 조합을 사용할 수 있습니다. 이는 2^n 성장을 의미합니다). 이것이 사실이라 할지라도 Ruby에서이 작업을 수행하는 정말 멋진 방법이 있어야합니다.

+2

질문이 명확하지 않습니다. 1. 제목에서 순열을 요구하지만 질문에서 조합을 요청합니다. 어느? 2. "대문자 변경 문자"를 썼지 만, "" ""AbCd1_k ""에 대문자 문자는 그대로 유지됩니다. 어느? – sawa

+0

ohp, 죄송합니다. 내 용어를 혼란스럽게 생각합니다. 좀 더 명확하게 질문을 업데이 트, 제안도 환영합니다 :) –

답변

4

이 방법에 대해 :

수익 값이 n은 최악의 경우 길이가 2^n 개의 항목이 있기 때문에 당신은 (2^N) * N 시간 복잡도보다 더 할 않을거야
def case_permutations(string) 
    string 
    .each_char 
    .reduce(['']) do |acc, char_string| 
     acc.flat_map do |prefix| 
     [char_string.upcase, char_string.downcase] 
      .uniq 
      .map do |modified_char| 
      "#{prefix}#{modified_char}" 
      end 
    end 
    end 
end 

.

+2

좋은 해결책. 당신은'.split ('')'을'.chars' 또는 (더 나은, 열거 자)'.each_char'로 대체 할 수 있습니다. –

+0

전화하세요. 업데이트 됨. – econerd4ever

1
def case_combos(str) 
    c = str.split('').map { |x| [x.upcase, x.downcase]} 
    (0...1<<str.size).to_a.map do |x| 
     z = "" 
     0.upto(c.size-1) do |y| 
      z += c[y][0] if (1<<y)&x == 0 
      z += c[y][1] if (1<<y)&x != 0 
     end 
     z 
    end.uniq 
end 
0
def every_combination(str = '') 
    return unless str 
    str.chars.permutation(str.size).map do |perm| 
    perm_char_case_pair = perm.map do |c| 
     [c.downcase, c.upcase] 
    end 
    perm_char_case_pair[0].product(*perm_char_case_pair[1..-1]).map(&:join) 
    end.flatten.uniq 
end 
관련 문제