|
1 | 1 | (ns otus-02.homework.common-child) |
2 | 2 |
|
3 | | - |
4 | 3 | ;; Строка называется потомком другой строки, |
5 | 4 | ;; если она может быть образована путем удаления 0 или более символов из другой строки. |
6 | 5 | ;; Буквы нельзя переставлять. |
|
15 | 14 |
|
16 | 15 | ;; Еще пример HARRY и SALLY. Ответ будет - 2, так как общий элемент у них AY |
17 | 16 |
|
| 17 | +; (defn lol [n] |
| 18 | +; (loop [i 0 r nil] |
| 19 | +; (if (> i n) |
| 20 | +; r |
| 21 | +; (loop [j 0 s nil] |
| 22 | +; (if (< j n) (recur (+ 1 j) (conj s [i j])) s))))) |
| 23 | +; |
| 24 | +; (lol 10) |
| 25 | +; |
| 26 | +; (defn look [s1 s2 i j t] |
| 27 | +; (let |
| 28 | +; [s1-elem (nth s1 (- i 1)) |
| 29 | +; s2-elem (nth s2 (- j 1)) |
| 30 | +; i-1j-1 (get-in t [(- i 1) (- j 1)]) |
| 31 | +; i-1j (get-in t [(- i 1) j]) |
| 32 | +; ij-1 (get-in t [i (- j 1)])] |
| 33 | +; (if (= s1-elem s2-elem) (assoc-in t [i j] (+ i-1j-1 1)) (assoc-in t [i j] (max i-1j ij-1))))) |
| 34 | +; |
| 35 | +; (get-in [[0,0,0,0,0,0], [0],[0],[0],[0],[0],[0]] [1 0]) |
| 36 | +; (assoc-in [[0,0,0,0,0,0], [0],[0],[0],[0],[0],[0]] [1 1] 12) |
| 37 | +; |
| 38 | +; (assoc-in [[0,0,0,0,0,0], [0],[0],[0],[0],[0],[0]] [2 1] 1) |
| 39 | +; |
| 40 | +; (range 1 (+ 2 (count "HARRY"))) |
| 41 | +; |
| 42 | +; (def i1 (look "HARRY" "SALLY" 1 1 [[0,0,0,0,0,0], [0], [0], [0], [0], [0], [0], [0]])) |
| 43 | +; (def i2 (look "HARRY" "SALLY" 1 2 i1)) |
| 44 | +; (def i3 (look "HARRY" "SALLY" 1 3 i2)) |
| 45 | +; (def i4 (look "HARRY" "SALLY" 1 4 i3)) |
| 46 | +; (def i5 (look "HARRY" "SALLY" 1 5 i4)) |
| 47 | +; |
| 48 | +; (def i6 (look "HARRY" "SALLY" 2 1 i5)) |
| 49 | +; (def i7 (look "HARRY" "SALLY" 2 2 i6)) |
| 50 | +; (def i8 (look "HARRY" "SALLY" 2 3 i7)) |
| 51 | +; (def i9 (look "HARRY" "SALLY" 2 4 i8)) |
| 52 | +; (def i10 (look "HARRY" "SALLY" 2 5 i9)) |
| 53 | +; |
| 54 | +; (def q (vec (repeat (+ 1 (count "HARRY")) 0))) |
| 55 | +; (def w (vec (repeat (+ 1 (count "SALLY")) [0]))) |
| 56 | +; (def e (vec (concat q w))) |
| 57 | + |
18 | 58 |
|
19 | | -(defn common-child-length [first-string second-string]) |
| 59 | +(defn common-child-length [s1 s2] |
| 60 | + (let [look (fn [s1 s2 i j t] |
| 61 | + (let |
| 62 | + [s1-elem (nth s1 (- i 1)) |
| 63 | + s2-elem (nth s2 (- j 1)) |
| 64 | + i-1j-1 (get-in t [(- i 1) (- j 1)]) |
| 65 | + i-1j (get-in t [(- i 1) j]) |
| 66 | + ij-1 (get-in t [i (- j 1)])] |
| 67 | + (if (= s1-elem s2-elem) (assoc-in t [i j] (+ i-1j-1 1)) (assoc-in t [i j] (max i-1j ij-1))))) |
| 68 | + t [(vec (repeat (+ 1 (count s1)) 0))] |
| 69 | + r (vec (repeat (+ 1 (count s2)) [0])) |
| 70 | + table (vec (concat t r)) |
| 71 | + irange (range 1 (+ 1 (count s1))) |
| 72 | + jrange (range 1 (+ 1 (count s2)))] |
| 73 | + (get-in (reduce (fn [t i] (reduce (fn [t1 j] (look s1 s2 i j t1)) t jrange)) table irange) [(count s1) (count s1)]))) |
20 | 74 |
|
| 75 | +(common-child-length "SHINCHAN" "NOHARAAA") |
21 | 76 |
|
22 | 77 |
|
0 commit comments