成对的69匹配序列定义为:
1、 空串""是一个成对的69序列;
2、如果"X"和"Y"是成对的69序列,那么"XY"也是成对的69序列;
3、如果"X"是一个成对的69序列,那么"6X9"也是一个成对的69序列;
4、每个成对的69序列都可以由以上规则生成。 例如,"", "69", "6699", "6969"都是成对的。
现在给出一个序列S,允许你的操作是: 在S的开始和结尾出添加一定数量的6或者9,使序列S变为一个成对的69序列。输出添加最少的6或者9之后成对的69序列是什么。
成对的69匹配序列定义为:
1、 空串""是一个成对的69序列;
2、如果"X"和"Y"是成对的69序列,那么"XY"也是成对的69序列;
3、如果"X"是一个成对的69序列,那么"6X9"也是一个成对的69序列;
4、每个成对的69序列都可以由以上规则生成。 例如,"", "69", "6699", "6969"都是成对的。
现在给出一个序列S,允许你的操作是: 在S的开始和结尾出添加一定数量的6或者9,使序列S变为一个成对的69序列。输出添加最少的6或者9之后成对的69序列是什么。
"66"
"6699"
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
public String Paired69 (String S) {
// write code here
Stack<Character> stack = new Stack<>();
StringBuilder sb = new StringBuilder();
for(char c: S.toCharArray()){
if(c == '6'){
stack.push(c);
}else{
if(!stack.isEmpty())
stack.pop(); // 还有6就弹出来与9配对
else
sb.insert(0, '6'); // 否则缺6,需要在前面补
}
sb.append(c);
}
while(!stack.isEmpty()){ // 6有余,往后补9
stack.pop();
sb.append('9');
}
return sb.toString();
}
} import java.util.*;
public class Solution {
// 变成69序列-感觉能回溯爆搜
public String Paired69 (String s) {
int cnt = 0;
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == '6') cnt++;
else cnt--;
}
back(s, cnt);
return res;
}
// 回溯爆搜
String res;
boolean flag = false;
public void back(String s, int cnt) {
if (valid(s)) { // 是69序列就直接返回
flag = true;
res = s;
return;
}
if (!flag) {
if (cnt > 0) back(s + '9', cnt-1); // 6多补9
else if (cnt < 0) back('6' + s, cnt+1); // 9多补6
else { // 一样多但是是96的形式 都补
back('6' + s, cnt+1);
back(s + '9', cnt-1);
}
}
}
// 判断是否为69序列
public boolean valid(String s) {
if (s.length() % 2 != 0) return false;
if (s.length() == 0 || s.equals("69")) return true;
if (s.length() > 2) {
if (s.charAt(0) == '6' && s.charAt(s.length()-1) == '9'
&& valid(s.substring(1, s.length()-1))) return true;// 左右拼接
for (int i = 2; i < s.length(); i+= 2) { // 中间拼接
if (valid(s.substring(0, i)) && valid(s.substring(i))) return true;
}
}
return false;
}
} package main
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
func Paired69( S string ) string {
// write code here
if len(S)==0 {
return S
}
stack,res := []rune{},""
for i:=0;i<len(S);i++{
if rune(S[i]) == '6' {
stack, res = append(stack, '9'),res+"6"; continue
}
if rune(S[i]) == '9' {
if len(stack) == 0 {
res = "6" + res + "9"; continue
} else {
res ,stack = res + "9", stack[1:]; continue
}
}
res = res + string(S[i])
}
for i:=0;i<len(stack);i++ {
res = res + "9"
}
return res
} import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
public String Paired69 (String S) {
// write code here
if (S.equals(""))
return "";
int str_len = S.length();
Stack<Character> six = new Stack<Character>();
Stack<Character> nine = new Stack<Character>();
for (int i = 0; i < str_len; i++) {
if ( S.charAt(i) == '6' ) {
six.push('6');
}
else if ( !six.empty() ) {
six.pop();
}
else {
nine.push('9');
}
}
StringBuilder output = new StringBuilder();
int six_size = six.size();
int nine_size = nine.size();
for ( int i = 0; i < nine_size; i++ )
output.append('6');
output.append(S);
for ( int i = 0; i < six_size; i++ )
output.append('9');
return output.toString();
}
} class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
string Paired69(string S) {
// write code here
int strSize = S.size();
if(strSize == 0) return S;
stack<int> handle;
string start="",end="";
for(int i=0; i< strSize;i++){
if(S[i]=='6'){
handle.push(6);
}else{
if(!handle.empty()&&handle.top()==6){
handle.pop();
}else{
start+="6";
}
}
}
while(!handle.empty()){
end+="9";
handle.pop();
}
return start+S+end;
}
};
//C++
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
string Paired69(string S) {
// write code here
int count = 0;
int minAdd = 0;
for (char& ch : S) {
if (ch == '6')
count++;
else {
count--;
if (-count>minAdd) {
minAdd = -count;
}
}
}
count = count + minAdd;
string ans = "";
string pre = "";
pre.append(minAdd, '6');
if (count == 0) return pre + S;
if (count < 0) {//9多
count = -count;
while (count--) {
ans += '6';
}
ans = pre + ans + S;
}
else {
while (count--) {
ans += '9';
}
ans = pre+S + ans;
}
return ans;
}
}; function Paired69( S ) {
// write code here
if(S.length === 0) return ''
let arr = S.split('')
let n = arr.length
let stack = []
for(let i = 0; i < n;i++){
if(S[i] === '6'){
stack.push(S[i])
}else{
if(stack.length === 0){
arr.unshift('6')
}else{
stack.pop()
}
}
}
console.log(stack)
for(let i = 0;i < stack.length;i++) arr.push('9')
return arr.join('')
} import java.util.*;
import java.util.Stack;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
public static String Paired69 (String S) {
// write code here
int n = S.length();
if(n==0) return "";
char[] arr = S.toCharArray();
StringBuilder sb = new StringBuilder();
Stack<Character> stack = new Stack<>();
int i = 0;
while(i<n || !stack.isEmpty()){
if(i<n && arr[i] == '6'){
sb.append('6');
stack.push('6');
}else{
if(!stack.isEmpty()){
sb.append('9');
stack.pop();
}else{
sb.insert(0,'6');
sb.append('9');
}
}
i++;
}
return sb.toString();
}
} public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param S string字符串
* @return string字符串
*/
public String Paired69 (String S) {
// write code here
if (S == null) {
return null;
}
char[] arr = S.toCharArray();
Stack<Character> stack = new Stack<>();
for (char c : arr) {
if (!stack.isEmpty()) {
char top = stack.peek();
//栈顶元素为6则弹出6,不添加;否则加入栈
if (top == '6' && c == '9') {
stack.pop();
continue;
}
}
stack.push(c);
}
StringBuilder res = new StringBuilder(S);
while (!stack.isEmpty()) {
char c = stack.pop();
//栈顶元素为6,在S最后面添一个9
//栈顶元素为9,在S最前面添一个6
if (c == '6') {
res.append('9');
} else if (c == '9') {
res.insert(0, '6');
}
}
return res.toString();
}
}