読者です 読者をやめる 読者になる 読者になる

TopCoder SRM 663 Div1 Easy: ABBADiv1

解法

targetの文字列のうち、initialあるいはinitialの反転部分を見つけ、その前後のBの数が条件にあっているかどうか確かめる。1回以上Bによる反転操作がある場合、絶対に先頭にAは来ない(これで落ちた)。

コード

public class ABBADiv1 {

	public String canObtain(String initial, String target) {
		StringBuffer sb = new StringBuffer(initial);
		String reverse = sb.reverse().toString();
		if (check(initial, target, 0)) {
			return "Possible";
		}
		if (check(reverse, target, 1)) {
			return "Possible";
		}
		return "Impossible";
	}

	private boolean check(String initial, String target, int reverse) {
		search: for (int start = 0; start <= target.length() - initial.length(); start++) {
			for (int i = 0; i < initial.length(); i++) {
				if (target.charAt(start + i) != initial.charAt(i)) {
					continue search;
				}
			}
			// 見つけた文字列と、その位置
			int end = start + initial.length();
			String prefix = target.substring(0, start);
			if (start == 0) {
				prefix = "";
			}
			String suffix = target.substring(end, target.length());
			if (end == target.length()) {
				suffix = "";
			}
			int bCnt = 0;
			for (int i = 0; i < prefix.length(); i++) {
				if (prefix.charAt(i) == 'B') {
					bCnt++;
				}
			}
			for (int i = 0; i < suffix.length(); i++) {
				if (suffix.charAt(i) == 'B') {
					bCnt--;
				}
			}
			if (bCnt == reverse) {
				if (prefix.length() == 0 || prefix.charAt(0) == 'B') {
					return true;
				}
			}

		}
		return false;
	}
}