質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

5回答

791閲覧

文字列が変更した際の変更文字数を求める

Ryotarox

総合スコア28

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/30 13:30

前提・実現したいこと

以下の問題をPythonを使用して解くのですが、方針が思いつきません。

「会社の看板を作ることになったあなたは、看板に文字列を表示するため、各文字の印刷された小看板を別々に発注して組み合わせることにしました。しかし、発注後に表示する文字列に変更があり、小看板を再発注することになりました。

あなたは再発注する小看板の数を減らすため、共通する文字の小看板を再利用することを考えました。

例えば 文字列が "tokyo" から "osaka" へと変更された場合、共通する o, k の 2 文字の小看板を再利用することで再発注数を 3 つに減らすことができます。
入力として変更前後の文字列の長さおよび文字列自身が与えられます。
この再利用方法で再発注しなければならない最小の小看板の数を出力してください。」

入力される値

入力は標準入力にて以下のフォーマットで与えられます。

n m s t

1行目に変更前の文字列の長さ n と 変更後の文字列の長さ m が半角スペース区切りで与えられます。
2行目に変更前の文字列 s が与えられます。
3行目に変更後の文字列 t が与えられます。
入力は合計で 3行 となり、 最終行の末尾に改行が1つ入ります

条件

すべてのテストケースにおいて、以下の条件をみたします。

n, m は整数
1 ≦ n, m ≦ 100000
(sの長さ) = n, (tの長さ) = m
s, t は半角英字小文字のみで構成される文字列

再発注しなければならない最小の小看板の数を整数で出力してください。
最後は改行し、余計な文字、空行を含んではいけません。

入力例

3 5 ant maven

出力例

3

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/09/30 13:34

問題の出典を示してください
Ryotarox

2018/09/30 13:39

すみません。学校の課題です。
a_saitoh

2018/09/30 16:03

takoがkotaに変わった場合、「0枚」が答えで良いのでしょうか?(位置を変えて再利用を考えに入れるか?)
Ryotarox

2018/09/30 22:47

はい!「0枚」でOKです。
guest

回答5

0

tiitoiさんの回答を参考に、こんなコードにしてみました。

python

1from collections import Counter 2 3str1 = 'ant' 4str2 = 'maven' 5 6print(sum((Counter(str2) - Counter(str1)).values())) 7

投稿2018/09/30 22:57

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2018/09/30 22:59

あ、書いてたら解決してた
Ryotarox

2018/10/01 07:30

わざわざ最後まで書いてくださりありがとうございます。自分はforやifを日常的に使うので、そういう方法を教えてくださると勉強になります。
guest

0

入力の文字数 m, n って入りますかね?

collections.Contour にリストを渡すと、要素とその出現回数の dict-like なオブジェクトが作れます。(str 型はリストにできる)

string = 'antman' print(Counter(string)) # Counter({'a': 2, 'n': 2, 't': 1, 'm': 1})

これを2つの文字列に適用し、各要素の出現回数を調べます。

from collections import Counter str1 = 'ant' str2 = 'maven' cnt1 = Counter(str1) cnt2 = Counter(str2) print('cnt1', cnt1) # cnt1 Counter({'a': 1, 'n': 1, 't': 1}) print('cnt2', cnt2) # cnt2 Counter({'m': 1, 'a': 1, 'v': 1, 'e': 1, 'n': 1})

str2 の各文字の出現回数から str1 の各文字の出現回数を減算します。

diff_cnt = cnt2 - cnt1 print('diff_cnt', diff_cnt) # diff_cnt Counter({'m': 1, 'v': 1, 'e': 1})

Counter.elements() で各要素の出現回数だけ繰り返すイテレータを取得できるので、list() でリスト化します。

diff = list(diff_cnt.elements()) print(diff)

最後に len() でその個数を数えると、それが str2 にあって str1 にない文字数になります。

print(len(diff)) # 3

投稿2018/09/30 13:48

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryotarox

2018/09/30 22:52

なるほど。参考になります。
guest

0

ベストアンサー

n, mを使ってないので模範解答では無いかも知れませんが結果は出ますのでご参考までに。

Python3

1n, m = map(int, input().split(' ')) 2s = list(input()) 3t = list(input()) 4for x in s: 5 if x in t: 6 t.remove(x) 7print(len(t))
入力 3 5 ant maven 出力 3

投稿2018/09/30 15:42

opyon

総合スコア1009

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryotarox

2018/09/30 22:51

一番簡潔で分かりやすいです。ありがとうございます。
hayataka2049

2018/09/30 23:03

惜しむらくはinやremoveが線形探索するせいでO(nm)になることですね。先に数える方法だとO(n+m)
opyon

2018/09/30 23:50

実行速度大事だと思います。 他の回答でも実行速度倍以上違うのにシンプルだったり回答速いだけでBAついてるの結構ありますよね。 こういう書き方もありますよってつもりで書いてるので私はBA変えて頂いて構いません。
Ryotarox

2018/10/01 07:27

ありがとうございます。参考にします!
guest

0

python3

1# n, m = map(int, input().split(' ')) 2s = sorted(input()) 3t = list(input()) 4 5d = [x for x in t if not x in s or s.remove(x)] 6print(d) 7print(len(d))

実行例
イメージ説明

参考情報

  • Python list subtraction operation

https://stackoverflow.com/questions/3428536/

投稿2018/10/01 16:27

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryotarox

2018/10/02 00:20

少し複雑ですけどありがとうございます。リンクも参考になりました。
guest

0

Pythonなど不要。そう、シェル芸ならね!

bash

1$ cat input.txt 25 5 3tokyo 4osaka 53 5 6ant 7maven 8$ cat input.txt|xargs -n4|while read a b c d;do comm -13 <(echo $c|grep -o .|sort) <(echo $d|grep -o .|sort)|wc -l|tr -d ' ';done 93 103

投稿2018/09/30 17:11

hichon

総合スコア5737

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ryotarox

2018/09/30 22:50

Python使用制限がなければそれでもいいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問