今回は、文字列の中から、特定の文字列(1文字の場合を含む)の個数をカウントする処理について。
文字列1とカウント対象の文字列(文字列2)の2つの文字列を標準入力から読み込み、文字列1に含まれる文字列2の個数を出力する処理を、C#、Java、JavaScript、PHP、Python3、Rubyの6言語で書いています。
C#
using System;
public class Sample{
public static void Main(){
var line1 = Console.ReadLine().Trim();
var line2 = Console.ReadLine().Trim();
//カウント対象の文字列を配列に変換
string[] sep = new string[] { line2 };
//文字列を分割し、個数-1で対象の文字列数を求める。
var arr = line1.Split(sep, StringSplitOptions.None);
Console.WriteLine(arr.Length-1);
}
}
.split()で文字列2で文字列1を分割して配列に入れ、その配列の要素数-1で、文字列1中に含まれる文字列2の個数をカウントできます。文字列2は複数文字でもOK。
.split()の第1引数には、配列に変換した文字列2、第2引数には、StringSplitOptions.Noneを入れます。
Java
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
String line1 = sc.nextLine().trim();
String line2 = sc.nextLine().trim();
//文字列を分割し、個数-1で対象の文字列数を求める。
String[] arr = line1.split(line2,-1);
System.out.println(arr.length-1);
}
}
.split()で文字列2で文字列1を分割して配列に入れ、その配列の要素数-1で、文字列1中に含まれる文字列2の個数をカウントできます。文字列2は複数文字でもOK。
.split()で文字列を分割する場合、第2引数に-1を入れておきます。そうしないと、対象文字列が終端にある場合に正常にカウントされないです。
JavaScript
process.stdin.resume();
process.stdin.setEncoding('utf8');
var lines = [];
var reader = require('readline').createInterface({
input: process.stdin,
output: process.stdout
});
reader.on('line', (line) => {
lines.push(line);
});
reader.on('close', () => {
var strline1 = lines[0].trim();
var strline2 = lines[1].trim();
//カウント対象の文字列で元の文字列を分割して配列に変換。
var check = strline1.split(strline2);
console.log(check.length - 1);
});
.split()で文字列2で文字列1を分割して配列に入れ、その配列の要素数-1で、文字列1中に含まれる文字列2の個数をカウントできます。文字列2は複数文字でもOK。
PHP
<?php
// Your code here!
$line1 = trim(fgets(STDIN));
$line2 = trim(fgets(STDIN));
//1バイト文字の場合
echo substr_count($line1,$line2);
//2バイト以上の文字の場合
echo mb_substr_count($line1,$line2);
?>
.substr_count()で、文字列1に含まれる文字列2の個数をカウントできます。文字列2は複数文字でもOK。
2バイト以上の文字を扱う場合は、.mb_substr_count()を使用します。
Python3
line1 = input().rstrip()
line2 = input().rstrip()
print(line1.count(line2))
.count()で、文字列1に含まれる文字列2の個数をカウントできます。文字列2は複数文字でもOK。
Ruby
line1 = gets.chomp
line2 = gets.chomp
#対象が1文字
puts line1.count(line2)
#対象が複数文字
puts line1.scan(line2).length
文字列2が1文字の場合は、.count()で文字列1に含まれる文字列2の個数をカウントできます。
文字列2が複数文字の場合は、.count()では正常にカウントできないです。この場合は、.scan()で文字列2を配列に入れ、その配列の要素数をカウントすることで、文字列1中に含まれる文字列2の個数をカウントします。