【毎週】No.185

C_01再フォーマットされた文字列

与えられた英数字の文字列s。(英数字の文字列は、小文字の英字と数字で構成される文字列です)。

文字の後に別の文字が続き、数字の後に別の数字がない文字列の順列を見つける必要があります。つまり、隣接する2つの文字が同じタイプを持つことはありません。

文字列を再フォーマットできない場合は、再フォーマットされた文字列を返すか、空の文字列を返します。

Input: s = "ab123"
Output: "1a2b3"

方法1:問題を単純化する

実際、とても複雑なのは言うまでもありません。より複雑な考え方は、

  • 最初に文字と文字の添え字を数えます。
  • 次に、数字と文字の数を比較して、最後に実行する人を制御するために、最後に他に多くのことを書きます。

問題を単純化する:

  • デフォルトの番号はdigが最大です。必要に応じて、交換によってdigが最も多くなります。
  • 次に、追加タイプの数が多い文字を最初に追加し、次に追加タイプの数が少ない文字を追加します。
    • ただし、条件を満たす必要があります。abs(dig.size() - alp.size() > 1つまり、2つのタイプの文字の数の差は1以下です。
public String reformat(String s) {
    StringBuilder sb = new StringBuilder();
    ArrayList<Character> dig = new ArrayList<>(), alp = new ArrayList<>();
    char[] S = s.toCharArray();
    for (int i = 0; i < S.length; i++) {
        if (Character.isDigit(S[i])) dig.add(S[i]);
        else alp.add(S[i]);
    }
    if ( Math.abs(dig.size() - alp.size()) > 1)
        return "";

    if (dig.size() < alp.size()) {
        ArrayList<Character> t = dig;
        dig = alp;
        alp = t;
    }
    for (int i = 0; i < dig.size(); i++) {
        sb.append(dig.get(i));
        if (i < alp.size()) {
            sb.append(alp.get(i));
        }
    }
    return sb.toString();
}

複雑さの分析

  • 時間の複雑さ: ) O(n)
  • スペースの複雑さ: O ( n ) O(n)

B_02なし

方法1:なし


B_03カエルを数える

さまざまなカエルからのカエルの音(文字列 "croak")の組み合わせを表す文字列croakOfFrogsを提供します。同時に鳴くカエルが複数存在する可能性があるため、croakOfFrogsには複数の「鳴き声」が混在しています。シミュレートされた文字列内のすべてのカエルに必要な異なるカエルの最小数を返します。

注:鳴き声の「鳴き声」を鳴らすには、カエルが「c」、「r」、「o」、「a」、「k」の5文字を​​順番に出力する必要があります。5つの文字すべてが出力されない場合、音は鳴りません。

文字列croakOfFrogsが有効な "croak"文字の混合ではない場合、-1を返します。

输入:croakOfFrogs = "crcoakroak"
输出:2 
解释:最少需要两只青蛙,“呱呱” 声用黑体标注
第一只青蛙 "crcoakroak"
第二只青蛙 "crcoakroak"

方法1:カウント

  • 正当な文字列では、各文字の出現回数が等しくなければならないためです。
  • 別の文字順序があり、番号が以前の相対順序の文字より大きい場合、この文字列は無効です。
  • 文字数が正当である場合、必要なカエルの数は、文字数cとkの違いにのみ依存します。
    • たとえば、カエル​​が再び電話をかけ、別のカエルも電話をかけている場合、この時点で必要なカエルの数は2になります。
public int minNumberOfFrogs(String croakOfFrogs) {
    int[] c = new int[5];
    char[] s = croakOfFrogs.toCharArray();
    int max = 0;
    for (char ch : s) {
        if (ch == 'c') c[0]++;
        if (ch == 'r') c[1]++;
        if (ch == 'o') c[2]++;
        if (ch == 'a') c[3]++;
        if (ch == 'k') c[4]++;
        for (int i = c.length-1; i >= 1; i--) {
            if (c[i] > c[i-1])
                return -1;
        }
        max = Math.max(max, c[0]-c[4]);
    }
    return c[0] == c[4] ? max : -1;
}

複雑さの分析

  • 時間の複雑さ: O ( n ) O(n)
  • スペースの複雑さ: O ( 1 ) O(1)
元の記事714件を公開 賞賛された199件 50,000件以上の表示

おすすめ

転載: blog.csdn.net/qq_43539599/article/details/105613074