[アルゴリズム]文字列の反転

9697 ワード

質問する
0と1のみからなる文字列を指定すると、その文字列のすべての数字を同じにしたいと思います.文字列の中で1つ以上の連続した数字を捕まえてすべて反転することができます.反転は1を0に、0を1にすることを意味します.
例えば、S=0001100の場合、
全体的にひっくり返すと1110011です.
4文字目から5文字目を反転すると111111になり、2文字目ですべて同じ数字になります.
ただし、最初から4文字目から5文字目に文字を反転させると、1回に1億円に変換でき、1回目ですべて同じ数字に変換できます.
指定した文字列をすべて0またはすべて1に等しくする最小回数を返します.
0001100
理解する
ひっくり返す回数を数えるなら?
前と後が違う文字の場合を逆さまに考えたとき.0001100この文字列の中で、3番目の数字は0で、4番目の数字は1なので、今はひっくり返る時だと思います.👉🏻 count += 1
  • はいずれも0
  • 前文字が0後文字が1の場合👉🏻 0に反転する回数+=1
  • すべてを1に変換
  • 前文字が1後文字が0の場合👉🏻 1に反転する回数+=1
  • 最初の字をひっくり返すなら?
  • はいずれも0
    最初の字が
  • なら.👉🏻 0に反転する回数+=1
  • すべてを1に変換👉🏻 1に反転した回数+=1
  • 頭文字1
  • 最高回数を獲得するには?
    合計0または0の場合の反転回数は、より小さい数で返されます.1の使用
    n/a.計画
  • はすべて0または1であり、反転回数を格納するスペースを作成します.
  • 0に反転した回数=>countToAllZero
  • 1に反転した回数=>countToAllOne
  • 最初の文字が0のはcountToAllOne、1のはcountToAllZeroプラス+1
  • 入力文字列
  • を返します.
  • 現在の文字列と直後の次の文字列が異なる場合、反転周波数に+1を加算
  • の次のシーケンスの文字列は0です.👉🏻 countToAllOne += 1
  • の次のシーケンスの文字列は1です.👉🏻 countToAllZero += 1
  • countToAllOneとcountToAllZeroは、より小さな値
  • を返します.
    function findCountToTurnOutToAllZeroOrAllOne(string) {
      const numbers = string.split('');
    
      let countToAllOne = 0;
      let countToAllZero = 0;
    
      const addCount = (string) => {
        const method = {
          '0' : () => countToAllOne += 1,
          '1' : () => countToAllZero += 1,
        }
    
        method[string]();
      }
    
      addCount(numbers[0]);
    
      
      numbers.forEach((number, index) => {
        const nextNumber = numbers[index + 1];
    
        if(!nextNumber) {
          return;
        }
        
        if(number !== nextNumber) {
          addCount(nextNumber);
        }
      });
    
      return Math.min(countToAllOne, countToAllZero);
    }
    パイ
    input = "011110"
    
    
    def find_count_to_turn_out_to_all_zero_or_all_one(string):
        count_to_all_zero = 0
        count_to_all_one = 0
    
        if string[0] == '0':
            count_to_all_one += 1
        elif string[0] == '1':
            count_to_all_zero += 1
    
        for i in range(len(string) - 1):
            if string[i] != string[i + 1]:
                if string[i + 1] == '0':
                    count_to_all_one += 1
                if string[i + 1] == '1':
                    count_to_all_zero += 1
    
        return min(count_to_all_one, count_to_all_zero)
    
    
    result = find_count_to_turn_out_to_all_zero_or_all_one(input)
    print(result)