【編程題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;
	}
	
}
相關文章
相關標籤/搜索