2013-03-28 3 views
0

여기에 문제가 있습니다. 문자열을 k 문자열의 일부로 연결된 사본으로 표시 할 수있는 경우 문자열을 k 문자열이라고합니다. 예를 들어 "aabaabaabaab"문자열은 동시에 1 문자열, 2 문자열 및 4 문자열이지만 3 문자열, 5 문자열 또는 6 문자열 등이 아닙니다. . 분명히 모든 문자열은 1 문자열입니다.문자열이 반복 루 브릭 인 경우 찾기

문자열 s는 소문자 영문자와 양의 정수 k로 구성됩니다. 당신의 임무는 결과 문자열이 k- 문자열이되도록 문자열 s의 문자 순서를 바꾸는 것입니다.

입력 첫 번째 입력 줄에는 정수 k (1 ≤ k ≤ 1000)가 포함됩니다. 두 번째 줄은 s를 포함하고, s의 모든 문자는 소문자 영어 문자입니다. 문자열 길이 s는 부등식 1 ≤ | s | ≤ 1000, 여기서 | s | 문자열 s의 길이입니다.

출력 결과가 k- 문자열이되도록 문자열 s의 문자를 재정렬하십시오. 단일 출력 라인에 결과를 인쇄하십시오. 솔루션이 여러 개인 경우 그 중 하나를 인쇄하십시오.

해결 방법이 없으면 "-1"(따옴표 제외)을 인쇄하십시오. 그것은 작동해야처럼이 솔루션이 보인다 나에게

k = gets.to_i 
str = gets.chomp.split(//) 
n = str.length/k 
map = Hash.new(0) 
map2 = Hash.new(0) 
str.each { |i| map[i] += 1 } 

x = str.uniq.permutation(n).map(&:join).each do |string| 
    string.each_char { |c| map2[c] += k } 
    if map2 == map 
    puts string*k 
    exit 
    end 
    map2 = Hash.new(0) 
end 

puts '-1' 

하지만 테스트 케이스에 실패

여기 내 코드입니다. 아무도 그 이유를 말할 수 있습니까?

+0

어떤 테스트 케이스에서 실패하고 어떻게 실패합니까? – Patashu

+0

테스트 케이스를 보여 주면 도움이 될 것입니다. –

+1

이것은 끔찍한 짐승처럼 보입니다. k- 문자열의 정의를 이해한다면 각 문자는 k 배의 배수가되어야합니다. 따라서 문자를 정렬하고 해당 발생을 계산하고 각 조건이 만족하는지 확인합니다. 그렇지 않으면 -1을 인쇄하십시오. 그렇지 않으면 하나의 "단위"를 나타내는 문자의 하위 집합을 찾아 무작위로 정렬하고 k 번 반복합니다. – Floris

답변

1

여기 내 해결책이 있습니다.

하나의 세그먼트를 만든 다음 k 번 출력하십시오. 문자가 k 번 (또는 그 배수)으로 나타나지 않으면 조기에 멈추고 -1을 출력하십시오.

k = gets.to_i 
str = gets.chomp.split(//) 
counts = Hash.new(0) 
str.each { |i| counts[i] += 1 } 

out = '' 
str.uniq.each do |c| 
    if counts[c] % k != 0 
    puts -1 
    exit 
    end 
    out = out + c*(counts[c]/k) 
end 

puts out*k 
관련 문제