C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++の予算内で等しい部分文字列を取得する


同じ長さの2つの文字列sとtを指定したとします。 sをtに変更したい。 sのi番目の文字をtのi番目の文字に変更すると、コストは| s [i] --t[i]|として割り当てられます。つまり、文字のASCII値の絶対差です。また、整数のmaxCostを指定しました。 maxCost以下のコストでtの対応する部分文字列と同じになるように変更できるsの部分文字列の最大長を見つける必要があります。

したがって、入力がs =“ abcd”およびt =“ bcdf”の場合、maxCostは3になります。これは、sの「abc」を「bcd」に変換できるためです。コストは3になり、出力は3になります。 3になります。

これを解決するには、次の手順に従います-

  • j:=0、sum:=0、ret:=0

  • 0からsおよびtサイズの最小値までの範囲のiの場合

    • 合計を|s[i] – t [i] |

      増やします
    • 合計>maxCost

      • 合計を|s[i] – t [i] |

        だけ減らします
      • jを1増やします

    • ret:=retの最大値と(i – j + 1)

  • retを返す

例(C ++)

理解を深めるために、次の実装を見てみましょう-

class Solution {
public:
   int equalSubstring(string s, string t, int maxCost) {
      int j = 0;
      int sum = 0;
      int ret = 0;
      for(int i = 0; i < min((int)s.size(), (int)t.size()); i++){
         sum += abs(s[i] - t[i]);
         while(sum > maxCost){
            sum -= abs(s[j] - t[j]);
            j++;
         }
         ret = max(ret, i - j + 1);
      }
      return ret;
   }
};

入力

"abcd"
"bcdf"
3

出力

3

  1. C++での等しいツリーパーティション

    n個のノードを持つ二分木があるとすると、元のツリーの1つのエッジを削除した後、値の合計が等しい2つのツリーにツリーを分割できるかどうかを確認するタスクがあります。 したがって、入力が次のような場合 そうすれば、出力は真になります。 これを解決するには、次の手順に従います- 1つのスタックstを定義する 関数solve()を定義します。これはノードを取ります ノードがnullの場合、- 0を返す leftSum:=solve(ノードの左側) rightSum:=solve(ノードの権利) curr:=val + leftSum+rig

  2. POSIXを使用してC++内でコマンドを実行し、コマンドの出力を取得するにはどうすればよいですか?

    ここでは、C++を介してPOSIXコマンドを使用する方法を説明します。プロセスは非常に単純で、system()という関数を使用する必要があります。この中に文字列を渡す必要があります。その文字列にはPOSIXコマンドが含まれます。 構文は次のようになります。 system(“command”) 例 #include <iostream> using namespace std; int main () {    cout << "Print string using echo command" <&