トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.170 スワップ文字列(Easy)

■■■問題■■■

入力に8文字以内の文字列Sが与えられる。
この文字列Sを構成する文字のうち、
「任意の隣り合う2つの文字を入れ替える」操作を任意回行うことができるとき、
作ることができる文字列の種類の数を求めてください。

ただし、入力文字列Sと同一の文字列は数に含まないものとします。

■■■入力■■■

S

1行目に文字列Sが与えられる。 (1 <= |S| <= 8)
文字列Sはすべてアルファベット大文字('A'〜'Z')で構成される。

■■■出力■■■

問題文の操作で作ることが出来る(入力文字列S自体を除く)文字列の種類の数を、
整数で出力してください。 


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input4";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("ABC");
            //5
            //文字列"ABC"の隣り合う2つの文字を何度か入れ替えてできる文字列は、以下の6通りです。
            //ABC ACB
            //BAC BCA
            //CAB CBA
            //ただし、入力文字列自体は含まないので、"ABC"を除いた5種類を作ることができます。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("DDDDDD");
            //0
            //何度入れ替えても、"DDDDDD"以外に作ることはできません。
            //入力文字列自体は含まないので、"DDDDDD"を除いた0種類が答えです。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("XYZYX");
            //29
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[0];

        var stk = new Stack<string>();
        stk.Push(S);
        var VisitedSet = new HashSet<string>() { S };

        while (stk.Count > 0) {
            string Popped = stk.Pop();

            for (int I = 0; I <= S.Length - 2; I++) {
                char[] NewCharArr = Popped.ToCharArray();
                NewCharArr[I] = Popped[I + 1];
                NewCharArr[I + 1] = Popped[I];
                string NewStr = new string(NewCharArr);
                if (VisitedSet.Add(NewStr))
                    stk.Push(NewStr);
            }
        }
        Console.WriteLine(VisitedSet.Count - 1);
    }
}


解説

文字列な長さが8文字で、制約が緩いので、
深さ優先探索でナイーブに解いてます。