1. 程式人生 > >最少操作次數(英雄會)

最少操作次數(英雄會)

題目詳情:

給定兩個字串,僅由小寫字母組成,它們包含了相同字元。

求把第一個字串變成第二個字串的最小操作次數,且每次操作只能對第一個字串中的某個字元移動到此字串中的開頭。

例如給定兩個字串“abcd" "bcad" ,輸出:2,因為需要操作2次才能把"abcd"變成“bcad" ,方法是:abcd->cabd->bcad。

-------------------------------------------------------------------------------------------------------------------------------------------------------------------

由於演算法基礎薄弱,題做出來了,卻不知道自己用的是什麼演算法,等後面有時間了一定得好好補下。

我的做法是:如果能找到 不移動 " 不必要移動的字元" 並且 "必須要移動的字元“  只移動一次的的方法,那麼這種方法的操作次數必然是最少的。

其中不必要移動字元是指 通過移動其他的字元而能使自己達到目的字串中的位置,而必須要移動的字元恰恰相反;

現在需要做的是找出這兩種字元,然後看能否找到"必須要移動的字元“  只移動一次的方法;

看下面的例子,由上面的字串 A 轉換為下面的字串 B :


根據結果B中的字元位置的限定,我們來找出A中哪些字元是不必要移動,而另外一些無論如何都是需要被移走的,顯然x、y、z是沒必要移動(比如y可以通過移走e、f、g達到B中的正確位置),而g,f,e,d,c,b,a這7個字元是必須要移走的(因為如果f不被移走的話,那麼z不可能成為最後一個字元,所以f是必須要移走的)。同時發現不必要移動的字元是目的字串B中某個末尾子串,並且這個子串中的字元在A中的先後順序與B中的順序一致。

然後需要考慮的是有沒有上述理想的移動方法呢?答案是有的,如下:

按B中除去末尾不必要移動的字元的子串的逆序來移動A中必要移動的元素,正好可以將A轉換為B。

可以認為移動分為兩步,刪除所有必須移動的元素,再按合理順序插入這些字元,即可以認為是將這些必要移動的字元先放在另外的串C,然後將這些字元按合理的順序插入到xyz前面。自己可以動手畫下上面的例子,依次移動g,f,e,d,c,b,a到開頭即能將A轉換為B。

由於題目只要求求最少的操作次數,那麼我們只需統計需要被移走的字元個數即可,程式碼如下:

#include <stdio.h>  
#include <iostream>  
#include <string>  
using namespace std;  
class Test {  
public:  
    static int getNumber (string   a,string   b){  
        int i=a.size()-1,j=i,cnt=0;
        for(;i>=0;i--){
            if(a[i]!=b[j]) cnt++;
            else   j--;
        }
        return cnt;  
    }  
};  
//start 提示:自動閱卷起始唯一標識,請勿刪除或增加。  
int main()  
{     
    cout<<Test::getNumber("abxcdyezfg", "abcdefgxyz")<<endl;     
}   
//end //提示:自動閱卷結束唯一標識,請勿刪除或增加


相關推薦

最少操作次數(英雄)

題目詳情: 給定兩個字串,僅由小寫字母組成,它們包含了相同字元。 求把第一個字串變成第二個字串的最小操作次數,且每次操作只能對第一個字串中的某個字元移動到此字串中的開頭。 例如給定兩個字串“abcd" "bcad" ,輸出:2,因為需要操作2次才能把"abcd"變成“b

最少操作次數使兩個字串相等

給定兩個字串,僅由小寫字母組成,它們包含了相同字元。 求把第一個字串變成第二個字串的最小操作次數,且每次操作只能對第一個字串中的某個字元移動到此字串中的開頭。 例如給定兩個字串“abcd" "bcad" ,輸出:2,因為需要操作2次才能把"abcd"變成“bcad" ,方

OJ7826-KKT最少操作次數

#include<iostream> using namespace std; int main() { long long a,b,k; cin>>a>>b>>k; if(k<=1){//特判,k=0或1時,a*k這個操作無效,直接計算b-a

動態規劃求解-將字串A變換為字串B 所用的最少字元操作次數

問題描述: 設A 和B 是2 個字串。要用最少的字元操作將字串A 轉換為字串B。 這裡所說的字元操作包括 (1)刪除一個字元; (2)插入一個字元; (3)將一個字元改為另一個字元。 將字串

面試官:你有m個雞蛋,如何用最少次數測出雞蛋在哪一層碎?

假設你面前有一棟n層的大樓和m個雞蛋,假設將雞蛋從f層或更高的地方放扔下去,雞蛋才會碎,否則就不會。你需要設計一種策略來確定f的值,求最壞情況下扔雞蛋次數的最小值。 leetcode原題連結 乍一看這道題很抽象,可能有的人一看到這個題目從來沒做過,就懵逼了。其實不用慌張,再花裡胡哨的題目,最後都可以抽象成我們

職場上這些操作都不?3個excel操作技巧幫你輕松解決問題

ctr clas exc class 做的 行選中 問題 技術分享 喜歡 在工作中excel表格占據了我們太多的空間和時間,如果我們沒有處理好的話我們就比較浪費時間,但是相對而言我們只要掌握好一些操作方法我們就可以輕松的解決這個問題,小編今天就和你們講解幾個比較簡單但是很實

nyoj 46-最少乘法次數 (遞推)

sca C/C++ ron content itl 輸入 一次 align IV 46-最少乘法次數 內存限制:64MB 時間限制:1000ms

LeetCode:最少移動次數使得數組元素相等||【462】

true 移動 邏輯 描述 假設 ++i 動作 數組元素 brush LeetCode:最少移動次數使得數組元素相等||【462】 題目描述 給定一個非空整數數組,找到使所有數組元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。 您可以假設數組的長度最多

【題解】英雄第二屆線上程式設計大賽·CSDN現場決賽:三元組的數量

題目連結: http://hero.csdn.net/Question/Details?ID=222&ExamID=217題目詳情 {5 3 1}和{7 5 3}是2組不同的等差三元組,除了等差的性質之外,還有個奇妙的地方在於:5^2 – 3^2 – 1^2 = 7^2 – 5^

2013年底csdn英雄線下程式設計決賽紀實

有幸於上週日(12月29日)去CSDN公司參加了英雄會舉辦的年底線下程式設計決賽。說是去比賽,其實知道自己這麼菜,也只是去參與一下,湊個熱鬧,捧個人場。主要還是為了去膜拜下大神,去CSDN總部看看,和july聊聊hero。 11點不到就出發去坐地鐵了,想著早點去看看能不能幫忙佈置一下比賽場

redis的初步認識,hello,world 單連線redis操作次數,效能檢視

redis的安裝下載,解壓就可。 1.開啟redis的服務 2,匯入jar 3測試程式碼 package test429Redis; import java.util.Currency; import org.apache.jasper.tagplugins.jstl.

小米oj——最少交換次數

描述 給出一個無序數列,每次只能交換相鄰兩個元素,求將原數列變成遞增數列的最少交換次數。 如:數列:2,3,1,交換3和1後變成:2,1,3;交換1和2之後變成:1,2,3。總共交換2次。 輸入 逗號隔開的正整數數列 輸出 正整數 輸入樣例 2,3,1 複製樣例 輸出樣例 2

Leetcode-462 Minimum Moves to Equal Array Elements II(最少移動次數使陣列元素相等 II)

1 class Solution 2 { 3 public: 4 int minMoves2(vector<int>& nums) 5 { 6 sort(nums.begin(),nums.end(

462.最少移動次數使陣列元素相等II

給定一個非空整數陣列,找到使所有陣列元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。 您可以假設陣列的長度最多為10000。 例如: 輸入: [1,2,3] 輸出: 2 說明: 只有兩個動作是必要的(記得每一步僅可使其中一個元素加1或減1): [1,2,3] =

連這些可以一鍵完成的操作都不,難怪做PPT效率那麼低

製作PPT的時候效率不太高,總是在某些操作上花費很長時間?其實,PPT中有很多操作都是可以一鍵快速完成的〜   1.重複上一次的操作 例子:如何快速批量新增重複的元素除了複製貼上,你還可以用這個方法,一鍵搞定,簡單又高效。 操作步驟:新增目標元素 - 按下【F4】鍵

字串切分成迴文子串所需的最少切分次數

題目描述:給定一個字串,計算出將該字串切分成若干個迴文子串所需的最少切分次數 思路:使用動態規劃,每一次DP,從i向右掃描,每找到一個迴文串就算一次DP的話,就可以轉換為f[i]在區間[i,n-1]之間最小的切分數量。 狀態轉移方程:f(i) = min{f(j+1)+1,f(j)}; 判斷是否是迴文串

演算法題:A與B玩遊戲若干輪,獲勝方獲得該輪分數,已知結束後A,B得分,求A最少獲勝次數

描述 A與B玩遊戲若干輪,獲勝方獲得該輪分數,已知結束後A,B得分,求A最少獲勝次數。 例如:A第1輪獲勝則A加1分,B不得分,A第2輪獲勝則A加2分,B不得分,以此類推。遊戲結束A共x分,B共y分,求A在所有輪次比賽中獲勝最少次數。 輸入:A,B遊戲結束

Leetcode:462.最少移動次數使陣列元素相等

給定一個非空整數陣列,找到使所有陣列元素相等所需的最小移動數,其中每次移動可將選定的一個元素加1或減1。 您可以假設陣列的長度最多為10000。 例如: 輸入: [1,2,3] 輸出: 2 說明: 只有兩個動作是必要的(記得每一步僅可使其中一個元素加1或減1): [1,2,3] =

小米OJ #8【最少交換次數

描述 給出一個無序數列,每次只能交換相鄰兩個元素,求將原數列變成遞增數列的最少交換次數。 如:數列:2,3,1,交換3和1後變成:2,1,3;交換1和2之後變成:1,2,3。總共交換2次。 輸入

演算法設計練習3——求字串轉化的最小操作次數

題目來自leetcode上的動態規劃類的練習題, 難度係數為hard。 題目要求計算把一個字串轉化成目標字串的最小操作次數。一開始我想到字串轉化的方法是按相等數目的字元遞增地進行轉化,這個方法不能有序地解決轉化的最小操作次數,所以找不到動態規劃的轉態轉移方程。後來參考d