概要
(())などをランダムウォークのように考えると、常に+の部分にいて、最終的には必ず0に戻ってくることがわかる。
効率のいい回答だったのは、回帰関数で解いているところ。
use proconio::input;
fn main() {
input! {
: i32,
n }
if n % 2 == 1 {
return;
}
let mut cs = Vec::new();
let mut answer = Vec::new();
let mut left = n / 2;
let mut right = n / 2;
&mut cs, &mut left, &mut right, &mut answer);
recursive(
for i in 0..answer.len() {
println!("{}", answer[i]);
}
}
fn recursive(cs: &mut Vec<char>, left: &mut i32, right: &mut i32, answer: &mut Vec<String>) {
if *left == 0 && *right == 0 {
.push(cs.iter().collect());
answerreturn;
}
if *left > 0 {
*left -= 1;
.push('(');
cs, left, right, answer);
recursive(cs.pop();
cs*left += 1;
}
if *right > 0 && *left < *right {
*right -= 1;
.push(')');
cs, left, right, answer);
recursive(cs.pop();
cs*right += 1;
}
}
発想としては、00001111,00010111,…のような二進数を作っていくことを考えていくところ。で、0の数を超えないように1をappendしていくわけだ。辞書式に並べていくわけだから、最初に0を入れて、後で1を入れれば、自ずと辞書式に並べられる。
発見
String Str Vecの相互変換
str と String の違い
- str is a “String” slice.
- Slice is a pointer to a block of memory.
- Slice is immutable.
- If you make a string via “string” then it is &str.
- String is type of “String”.
- String is a heap-allocated string. It is growable, mutable like vec and UTF-8 encoded.
String -> str
let s: String = "abc".to_string();
let ss: &str = &s;
println!("{}", &ss); // → abc
char -> String
let c: char = 'a';
let cs: String = c.to_string();
println!("{}", &cs); // → a
Vec -> String
let cs: Vec<char> = vec!['a', 'b', 'c'];
let s: String = cs.iter().collect();
println!("{}", &s); // → abc
String -> Vec
let s: String = "abc".to_string();
let cs: Vec<char> = s.chars().collect();
println!("{:?}", &cs); // → ['a', 'b', 'c']
Binaryの話。
fn main() {
let x = 13;
// bが2進数に変換という意味。020は0を20桁まで入れるという意味。
let s = format!("{:020b}", x);
println!("{}", s);
}
問題点
next_permutation??
ユーザー解説の内容が理解できなかった。
next_permutationなんとかって言ってたけど、意味がわからんかった。