2016-10-17 7 views
0

이 프로젝트에 대해 마지막으로 게시 한 프로젝트이므로 거의 완료되었지만 검색중인 하위 문자열의 크기를 늘려야하는 부분이 있습니다. 이것은 프로그램의 프롬프트입니다.OCAML 증가 검색 하위 문자열 크기

Description: 
You are given a DNA sequence: 
a string that contains only characters 'A', 'C', 'G', and 'T'. 
Your task is to calculate the number of substrings of sequence, 
in which each of the symbols appears the same number of times. 

Example 1: 
For sequence = "ACGTACGT", the output should be 6 
All substrings of length 4 contain each symbol exactly once (+5), 
and the whole sequence contains each symbol twice (+1). 

Example 2: 
For sequence = "AAACCGGTTT", the output should be 1 
Only substring "AACCGGTT" satisfies the criterion above: it contains each symbol twice. 


Input: String, a sequence that consists only of symbols 'A', 'C', 'G', and 'T'. 
Length constraint: 0 < sequence.length < 100000. 

이 내 code`

let countA = ref 0 
let countC = ref 0 
let countG = ref 0 
let countT = ref 0 
let subStricount = ref 0 
let tempH = ref 0 
let tempT = ref 3 

let countChar x = 
    match x with 
     'A'-> countA := !countA +1; 
    | 'C' -> countC := !countC +1; 
    | 'T' -> countT := !countT +1; 
    | 'G' -> countG := !countG +1; 
;; 
let demoStri = read_line() in 
let striL = String.length demoStri in 
for i = 0 to striL -1 do 
    if !tempT < striL then 
     for j = !tempH to !tempT do 
      countChar demoStri.[j]; 
      if (countA = countC) && (countC = countG) && (countG = countT) then subStricount := !subStricount +1; 
     done; 
     countA := 0; 
     countC := 0; 
     countG := 0; 
     countT := 0; 
     tempH := !tempH +1; 
     tempT := !tempT +1; 
done; 
if String.length demoStri > 4 then 
    for i = 0 to String.length demoStri - 1 do 
     countChar demoStri.[i]; 
    done; 
if (!countA > 0) && (countA = countC) && (countC = countG) && (countG = countT) then subStricount := !subStricount + 1; 


print_int !subStricount; print_string "\n"; 

` 이 코드는 문자열의 입력을 계산 잘 실행하고, 예를 들어 ACGTACGT 그러나 그것은 단지 4의 문자열에서 검색되고, 6을 반환합니다 거기에 길이가 4 배열을 검색 한 후 문자열 자체 크기에 도달 할 때까지 크기를 늘리려면 코드 방법이 무엇입니까?

let tempH = ref 0 
let tempT = ref 3 

let striL = String.length demoStri in 
. . . 
if (!countA > 0) && (countA = countC) && 
    (countC = countG) && (countG = countT) then 
    subStricount := !subStricount + 1; 

를 그리고 두 개의 매개 변수의 함수로합니다 : demoStrisubstrLen

답변

1

는 개념적으로 싶은 것은 코드의이 부분을 가지고있다. tempT에서 substrLen - 1으로 초기화하십시오.

그런 다음이 함수를 다양한 값 (substrLen)으로 호출하십시오.

+0

그래도 부분 문자열 크기가 증가합니까? 나는 하위 문자열 크기를 늘려서 밑 부분의 루프에 대해 세 번째 비트를 제거 할 수 있지만 어려운 것은 무엇인지 알아 냈습니다. –

+0

하위 문자열 길이에 의존하는 코드 부분을 찾아야합니다. 그것들은'substrLen' 매개 변수에 대신 의존합니다. 이것은 프로그래밍의 핵심입니다 (IMHO). 확실히 작동 할 것입니다. 모든 소프트웨어는 이런 종류의 추상화에 달려 있습니다 :-) –

+0

나는 당신이 무슨 뜻인지 이해하지 못합니다. 그러나 나는 그것을 잠깐 넣으려고했는데, 지금은 잘못된 대답을주었습니다. while 루프 안에 모든 것을 넣고,! tempT