Нэг string-ийг нөгөө string болгоход хэрэгтэй хамгийн цөөн үйлдлийг (устгах, нэмэх, солих) хүснэгтээр олно.
Эхлээд жижиг бодлого
"CAT"-ийг "CUT" болгоё. Нэг үйлдлээр нэг үсэг устгах, нэмэх эсвэл солих боломжтой.
A-г U-гаар солиход л болно, хариу 1. Харин "AB"-г "BA" болгоход 2 үйлдэл хэрэгтэй: хоёр үсгийг хоёуланг нь солино, эсвэл A-г устгаад ард нь нэмнэ.
Энгийн аргаас санаа руу
Энгийн арга бол бүх боломжит үйлдлийн дарааллыг туршиж үзэх. Алхам бүрт гурван сонголт тул хэдхэн алхамд л хэтэрхий олон болно.
Гол санаа: хоёр string-ийн сүүлийн үсгийг харна. Ижил бол юу ч хийх хэрэггүй: dp[i][j] = dp[i - 1][j - 1]. Өөр бол сүүлийн үйлдэл гурван янз: s-ийн сүүлийн үсгийг устгах dp[i - 1][j], t-ийн сүүлийн үсгийг нэмэх dp[i][j - 1], сүүлийн үсгийг солих dp[i - 1][j - 1]. Хамгийн багыг нь аваад 1 нэмнэ.
Нэр томьёо ба тэмдэглэгээ
- dp[i][j]
- State: s-ийн эхний i үсгийг t-ийн эхний j үсэг болгох хамгийн цөөн үйлдэл.
- base case
dp[i][0] = i: бүх үсгийг устгана.dp[0][j] = j: бүх үсгийг нэмнэ.- устгах, нэмэх, солих
- Дээрх, зүүн, зүүн дээд нүд. Аль нүдийг сонгосноор ямар үйлдэл хийснийг мэднэ.
- Levenshtein distance
- Edit Distance-ийн өөр нэр.
s = SUNNY string-ийг t = SNOWY болгоё. Нэг үйлдлээр нэг үсэг устгах, нэмэх эсвэл солих боломжтой. Хамгийн цөөндөө хэдэн үйлдэл хэрэгтэй вэ? State: dp[i][j] нь s-ийн эхний i үсгийг t-ийн эхний j үсэг болгох хамгийн цөөн үйлдэл.
- Space тоглуулах
- ←→ алхам
- −+ хурд
- Бөглөж буй нүд
- Transition-д уншиж буй нүд
- Бөглөсөн
- Хариу ба үйлдлийн зам
Нэг string-ийг нөгөө болгох
SUNNY-г SNOWY болгоё. Нэг үйлдлээр нэг үсэг устгах, нэмэх эсвэл солих боломжтой. Хамгийн цөөндөө хэдэн үйлдэл хэрэгтэй вэ?
Дараа нь юу болох вэ?
Оноо 0 / 00дараалсан зөв, хамгийн их 0
Animation нэг алхам дээр зогсоно. Дараа нь код юу хийх вэ? Таагаад оноо цуглуул! Нэвтрэх хэрэггүй, оноо чинь энэ төхөөрөмж дээр хадгалагдана.
Юунд хэрэгтэй вэ?
Үсгийн алдаа засагч, хайлтын "Та үүнийг хайсан уу?" санал ийм зайгаар ойролцоо үгийг олдог. Хоёр string-ийг харьцуулдаг сонгодог DP бодлого.
Яаж ажилладаг вэ?
1. State: dp[i][j] нь s-ийн эхний i үсгийг t-ийн эхний j үсэг болгох хамгийн цөөн үйлдэл. 2. Base case: dp[i][0] = i (бүгдийг устгана), dp[0][j] = j (бүгдийг нэмнэ). 3. s[i − 1] = t[j − 1] бол: dp[i][j] = dp[i − 1][j − 1]. 4. Өөр бол: dp[i][j] = 1 + min(dp[i − 1][j], dp[i][j − 1], dp[i − 1][j − 1]). Эдгээр нь дарааллаараа устгах, нэмэх, солих. 5. Хариу нь dp[n][m]. Оролт: хоёр мөрөнд s ба t string.
Яагаад зөв, хэр хурдан бэ?
Хамгийн сайн үйлдлийн дарааллыг s-ийн сүүлийн үсгээр нь ангилъя: тэр үсэг устсан, тэр үсэг t-ийн сүүлийн үсэг болсон (ижил эсвэл солигдсон), эсвэл t-ийн сүүлийн үсэг шинээр нэмэгдсэн. Өөр боломж байхгүй, гурвуулаа transition-д бий.
Хугацаа ба санах ой O(n · m). Хоёр 1000 үсэгтэй string-д сая нүд.
Түгээмэл алдаа
- Base case-ийг мартах. Хашаа 0 биш,
dp[i][0] = i,dp[0][j] = jбайх ёстой. LCS-ээс ялгаатай. - Үсэг ижил үед ч +1 нэмэх. Ижил бол үйлдэл хэрэггүй.
min({a, b, c})гэж хаалтыг мартах.minхоёр тоо л авдаг, гурвыг бол{}дотор бичнэ.
Хязгаарын тохиолдол
- Хоёр string ижил: хариу 0.
- Нэг string хоосон: хариу нь нөгөөгийнх нь урт.
- Нийтлэг үсэггүй, урт нь ижил: хариу нь урт, бүх үсгийг солино.
Өөрийгөө шалга
"KITTEN"-ийг "SITTING" болгоход хэдэн үйлдэл хэрэгтэй вэ?
Хариу харах
3: K-г S-ээр солих, E-г I-гаар солих, G нэмэх.
"A"-г "XYZ" болгоход хэдэн үйлдэл вэ?
Хариу харах
3: A-г X-ээр солиод Y, Z нэмнэ.
Үсэг өөр үед хүснэгтийн аль гурван нүдийг уншдаг вэ?
Хариу харах
Дээрх, зүүн, зүүн дээд нүдийг.
Гурван дадлага
Hint-ээ нээхээс өмнө өөрөө оролдоорой.
1."HORSE"-ийг "ROS" болгох хүснэгтийг бөглөөд хариуг ол.
Hint харах
Эхний багана 0, 1, 2, 3, 4, 5, эхний мөр 0, 1, 2, 3.
Хариу ба тайлбар
Хариу 3: H-ийг R-аар солих, R-ыг устгах, E-г устгах.
2.Солих үйлдэл 2 гэж үнэтэй болсон. Кодыг өөрчлөөд "SUNNY" → "SNOWY"-ийн хариуг ол.
Hint харах
Зөвхөн зүүн дээд нүдэнд нэмэх тоо өөрчлөгдөнө.
Хариу ба тайлбар
min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 2). Хариу 4. Энэ ньn + m − 2 · LCS = 5 + 5 − 2 · 3-тай тэнцүү.3.Тоог биш, хийх үйлдлүүдийг өөрсдийг нь хэвлэдэг болго.
Hint харах
dp[n][m]-ээс эхлээд аль хөршөөс ирснийг хараад буцаж алх.Хариу ба тайлбар
Үсэг ижил бол
i--, j--. Үгүй болdp[i][j] == dp[i - 1][j] + 1бол устгах,dp[i][j - 1] + 1бол нэмэх, бусад үед солих. Үйлдлүүдийг урвуу дарааллаар хэвлэнэ.
Жишээ
Оролт
SUNNY SNOWY
Гаралт
3