连接: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; } }