Leetcode 1320 二指輸入的的最小距離

2021-10-02 11:35:48 字數 2518 閱讀 9806

oj

題意非常的明確,我們直接來進行分析,要求出最小的移動距離,其實非常容易的我們就能想到兩個手指最開始的位置,一定都是在鍵盤中的某個輸入串中包含的字元上面的,但是我們並不能確定在哪個位置。不過,我們能確定其中乙個手指最開始的位置,那就是輸入串第乙個字元所在位置,這一點其實非常容易想通,因為我們不管把手指放在什麼位置,都要移動去輸入第乙個字元,那還不如直接放在第乙個字元上,但是第二個手指並不能這樣確定。還有一點就是,每當我們輸入乙個字元之後,乙個有乙個手指是在當前輸入字元的位置上的。

再進行分析我們能發現,當我們輸入字串結束之後,其實是一種狀態轉換,我們假設現在兩個手指乙個l乙個r,當面臨乙個待輸入的字元的時候,我們要麼拿l去按,要麼拿r去按。那到達拿哪個呢?拿距離最近的那個嗎?其實不對,拿最近的乙個只是乙個區域性的最優解(當前步最優),但是對於整個問題來說,可能並不是最優解。比如你可以嘗試一下「zknbz」,這個輸入串按照這種思路是不能得到乙個最小的結果的。

雖然這種方式不行,但是根據我們前面的分析,我們至少能得乙個狀態轉移方程了。其中包含l,r,和當前輸入串的下標index。我們就能得到乙個狀態轉移方程了。dp[index][l][r],表示當前在輸入串的下標i的位置,l手指在鍵盤第l個位置,r手指在鍵盤的第r個位置的最小移動距離,那麼轉移方程就為

dp[1]

[l][r]

= math.

min(dp[1]

[l][r]

, dp[0]

[l][r]

+move

(l, l))或

dp[1

][l]

[r]= math.

min(dp[1]

[l][r]

, dp[0]

[l][r]

+move

(r, r)

)其中的l和r表示上乙個狀態l手指或者r手指所在位置

注意觀察,如果移動的是l手指,那麼上乙個階段右指為 r,此時這個階段右指也必須保持不變,同樣為r

根據狀態轉移方程我們就能寫出dp公式了

優化空間

因為當前輸入字元的狀態只依賴其前乙個輸入字元的狀態,所以可以利用滾動陣列來優化,這也是dp的常用優化手段了。

優化時間

我們可以換乙個想法,我們只記錄其中乙個手指所在位置和當前輸入串的下標。

我們利用輸入串的下標,完全可以推斷出另外乙個手指的位置,因為你輸入了下標為i的位置的字元,那麼你一定有乙個手指在對應的位置上。所以我們就利用了兩個狀態來表示上面的三個狀態了

時間優化後的**實現,空間沒有優化

public

intminimumdistance

(string word)

for(

int i =

0; i < word.

length()

; i++

)int min = integer.max_value;

for(

int i =

1; i < word.

length()

; i++)}

}if(i == word.

length()

-1)}

}return min;

}// 計算距離

public

intdis

(int a,

int b)

這乙個狀態轉移方程與上面一樣,有一點點不同,可以擴充想法

public

intminimumdistance

(string word)

for(

int i =

0; i < word.

length()

; i++

)int min = integer.max_value;

for(

int i =

1; i < word.

length()

; i++

)int disa =

dis(word.

charat

(i -1)

-'a'

, cur)

;int disb =

dis(j, cur)

; dp[i]

[j]= math.

min(dp[i -1]

[j]+ disa, dp[i]

[j])

; dp[i]

[word.

charat

(i-1)-

'a']

= math.

min(dp[i -1]

[j]+ disb, dp[i]

[word.

charat

(i-1)-

'a']);

if(i == word.

length()

-1)}

}return min;

}

C語言 二 指標

一 指標概述 1.簡介 2.初始化 1 先定義後初始化 int a 10 int p p a 2 定義並初始化 int a 10 int p a 備註 在資料型別後,變數名稱前的 是乙個說明符,用來說明該變數是乙個指標變數。如果前面沒有資料型別,如 p,這裡的 是乙個指標運算子,用來取出指標變數所指...

proc c 程式設計(二) 指示變數

指示變數 與宿主變數相關聯,用於監督和管理相關聯的宿主變數。每乙個宿主變數可以定義乙個指示變數。作用 1.向資料庫表列輸入null值。2.檢查資料庫所取值是否為null值,或者發生截斷問題。指示變數值含義 輸入宿主變數 1 oracle把null值輸入資料庫表列,不考慮與該指示變數相關的宿主變數。0...

Vue基本使用二 指令

指令 directives 是帶有 v 字首的特殊屬性 用來設定當前元素的文字內容。相當於 innertext 的功能 v text msg 預設的文字內容h1 v html msg 預設的文字內容h1 v bind title msg v bind zhidingyi xm 預設的文字內容h1 t...