🧩

【Java】力任せ法

2024/11/30に公開

この記事は、「新・明解Javaで学ぶアルゴリズムとデータ構造」を読んで学んだことを、個人的な備忘録目的でまとめています。

ただし、本を参考にして自分なりに構成やコードを変更しているためご注意ください。
アルゴリズムの詳細や解説は是非参考書をお手に取って読まれてください。

【リンク紹介】
Javaで学ぶアルゴリズムとデータ構造
これまで書いたシリーズ記事一覧

タイトル

package chap07;

import java.util.Scanner;

//--- 力任せ法による文字列探索 ---//
public class BruteForceMethodMatch {
	
	static int bfMatch(String text, String pattern) {
		
		int pt = 0;    // textをなぞるカーソル(ポインタ)
		int pp = 0;    // patternをなぞるカーソル(ポインタ)
		
		while (pt != text.length() && pp != pattern.length()) {
			
			if (text.charAt(pt) == pattern.charAt(pp)) {
				pt++;
				pp++;
			} else {
				pt = pt - pp + 1;
				pp = 0;
			}
		}
		
		if (pp == pattern.length())
			return pt - pp;    // 探索成功
		return -1;             // 探索失敗
	}
	
	public static void main(String[] args) {
		Scanner stdIn = new Scanner(System.in);
		
		// テキスト用文字列
		System.out.print("テキスト:");
		String s1 = stdIn.next();
		
		// パターン用文字列
		System.out.print("パターン:");
		String s2 = stdIn.next();
		
		// 文字列s1から文字列s2を力まかせ法で探索
		int idx = bfMatch(s1, s2);
		
		if (idx == -1) {
			System.out.println("テキスト中にパターンは存在しません。");
		} else {
			
			// マッチ文字の直前までの半角での文字数を求める
			int len = 0;
			
			for (int i = 0; i < idx; i++) {
				len += s1.substring(i, i + 1).getBytes().length;
			}
			
			len += s2.length();
			
			System.out.println((idx + 1) + "文字列にマッチします。");
			System.out.println("テキスト:" + s1);
			System.out.printf(String.format("パターン:%%%ds\n", len), s2);
		}
	}
}

学習内容まとめ

eclipse操作時に役立つショートカットまとめ
https://qiita.com/toshi0383/items/1d2a990392998789062c

\bf{\textcolor{red}{記事が役に立った方は「いいね」を押していただけると、すごく喜びます \ 笑}}
ご協力のほどよろしくお願いします。

Discussion