【编程题m_0010】丑陋的字符串

连接:https://www.nowcoder.com/questionTerminal/a26c93faf2114176bcf6768a5f162926
来源:牛客网

牛牛喜欢字符串,可是他讨厌丑陋的字符串。对于牛牛来讲,一个字符串的丑陋值是字符串中相同连续字符对的个数。好比字符串“ABABAABBB”的丑陋值是3,由于有一对"AA"和两对重叠的"BB"。如今给出一个字符串,字符串中包含字符'A'、'B'和'?'。牛牛如今能够把字符串中的问号改成'A'或者'B'。牛牛如今想让字符串的丑陋值最小,但愿你能帮帮他。java

输入描述:spa

输入包括一个字符串s,字符串长度length(1 ≤ length ≤ 50),字符串只包含'A','B','?'三种字符。

输出描述:code

输出一个整数,表示最小的丑陋值

示例1字符串

输入

A?A

输出

0

解题思路:先计算除?外相邻字符相同的个数num1,再一次处理每组?,若是其中一侧延伸到了尽头,则num2=0,不然,若是包含偶数个?,两端相同则num=1,不一样则num2=0,若是包含奇数个?,两端相同则num=0,不一样则num2=1。get

package BiShiTi;

import java.util.Scanner;

public class m_0010 {

	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		String str = scan.nextLine();
		
		int uglyNum = getUglyNum(str);
		System.out.println(uglyNum);
	}

	static int getUglyNum(String str){
		int strLen = str.length();

		int uglyNum = 0;
		
		// 先处理除?外的字符
		for (int i = 0; i < strLen-1; i++) {
			if (str.charAt(i) == '?') {
				continue;
			}
			if (str.charAt(i) == str.charAt(i+1)) {
				uglyNum += 1;
			}
		}
		// 再处理?
		for (int i = 1; i < strLen-1; i++) {
			if (str.charAt(i) == '?') {
				// 计算连续?的个数
				int left = i - 1;
				int right = i + 1;
				while (left >= 0) {
					if (str.charAt(left) == '?') {
						left -= 1;
						continue;
					}else{
						break;
					}
				}
				while (right < strLen) {
					if (str.charAt(right) == '?') {
						right += 1;
						continue;
					}else{
						break;
					}
				}
				i = right - 1;
				
				if (left == -1 || right == strLen) { // 若是其中一侧的?延伸到了尽头
					uglyNum += 0;
				}else if ((right-left-1) % 2 == 0) {// 若是存在偶数个?
					if (str.charAt(left) == str.charAt(right)) {
						uglyNum += 1;
					}else {
						uglyNum += 0;
					}
				}else {// 若是存在奇数个?
					if (str.charAt(left) == str.charAt(right)) {
						uglyNum += 0;
					}else {
						uglyNum += 1;
					}
				}
			}
		}
		
		return uglyNum;
	}
	
}
相关文章
相关标签/搜索