问题一:
题目描述
求含有重复字符的字符串的全排列
输入描述:
一个字符串
输出描述:
一个字符串为一行
示例1
输入
pass
输出
apss
asps
assp
pass
psas
pssa
saps
sasp
spas
spsa
ssap
sspa
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
static boolean[] visited;
static char[] ch;
static int len;
public static void main(String[] args){
try {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String str;
while((str = br.readLine()) != null) {
len = str.length();
visited = new boolean[len];
ch = str.toCharArray();
Arrays.sort(ch);
backtrack(new char[len], 0);
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void backtrack(char[] res, int count) {
if(count == len) {
System.out.println(res);
return;
}
for(int i = 0; i < len; i++) {
if(visited[i]) continue;
if(i > 0 && ch[i] == ch[i-1] && visited[i-1]) continue;
res[count] = ch[i];
visited[i] = true;
backtrack(res, count+1);
visited[i] = false;
}
}
}
问题二:
题目描述
输入含有多个字符串和一个整数k。规定两个相邻字符串的距离为1。要求任意调整这n个字符串,最终使得任意两个相同字符串的距离不小于k。
输入描述:
这些字符串是在第一行且是用空格隔开的
输出描述:
如果存在这种调整,输出Yes,否则输出No
示例1
输入
I was Fred eating Fred
输出
Yes
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
static HashMap<String, Integer> map;
static boolean[] visited;
static int len;
static int k;
public static void main(String[] args){
try {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String str;
while((str = br.readLine()) != null) {
map = new HashMap<>();
k = Integer.parseInt(br.readLine());
String[] parts = str.split(" ");
len = parts.length;
visited = new boolean[len];
for(int i = 0; i < len; i++) {
if(!map.containsKey(parts[i])) map.put(parts[i], 1);
else map.put(parts[i], map.get(parts[i])+1);
}
if(getRes()) System.out.println("Yes");
else System.out.println("No");
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static boolean getRes() {
int begin = 0;
int cur;
ArrayList<Word> wordList = new ArrayList<>();
for(Map.Entry<String, Integer> entry: map.entrySet()) {
wordList.add(new Word(entry.getKey(), entry.getValue()));
}
Collections.sort(wordList, new Comparator<Word>() {
public int compare(Word o1, Word o2) {
return o2.value - o1.value;
}
});
for(Word w : wordList) {
while(begin < len && visited[begin]) begin++;
if(begin >= len) return false;
if(!visited[begin]) {
visited[begin++] = true;
}
cur = begin;
for(int i = 1; i < w.value; i++){
cur += k-1;
if(cur >= len) return false;
while(cur < len && visited[cur]) cur++;
if(cur >= len) return false;
visited[cur] = true;
}
}
return true;
}
}
class Word{
String str;
int value;
Word(String a, int b) {
str = a;
value = b;
}
}
问题三:
题目描述
输入共m+1行(这句话是我加的,题目就是这个意思)。一个m行n列矩阵,相邻两个元素用空格隔开。m,n可能很大(题目没有给出具体值)。每个元素的值为1,0,-1其中的一个。第m+1行(这个在试卷里面没有说明,监考老师补充的,按照监考老师的说法是最后一行)为一个换行符。
规定两个元素a[i][j], a[m][t]属于一个group,当且仅当满足以下条件:
(1)|j-t| = 1 且 i=m或者 |i-m| = 1 且 j=t
(2)a[i][j] = a[m][t] != 0
要求输出group数目。非法矩阵输出 -1
输入描述:
输入共m+1行(这句话是我加的,题目就是这个意思)。一个m行n列矩阵,相邻两个元素用空格隔开。
输出描述:
要求输出group数目。非法矩阵输出 -1
示例1
输入
0 0 1 1 0
0 -1 -1 -1 0
0 1 -1 0 0
0 1 -1 -1 0
输出
7(不确定)
import java.util.*;
import java.io.*;
import java.text.* ;
import java.math.*;
public class Main
{
static HashMap<String, Integer> map;
static boolean[] visited;
static int len;
static int k;
public static void main(String[] args){
try {
BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
String str;
int[][] dir = {{-1,0},{1,0},{0,-1},{0,1}};
ArrayList<ArrayList<Integer>> matrix = new ArrayList<>();
while((str = br.readLine()) != null) {
if(str.length() == 0) break;
ArrayList<Integer> tmp = new ArrayList<>();
String[] parts = str.split(" ");
for(int i = 0; i < parts.length; i++) {
tmp.add(Integer.parseInt(parts[i]));
}
matrix.add(new ArrayList<>(tmp));
}
int m = matrix.size();
int n = matrix.get(0).size();
boolean mark = false;
int group = 0;
for(int i = 0; i < m; i++) {
ArrayList<Integer> tmp = matrix.get(i);
if(tmp.size() != n) {
mark = true;
break;
}
for(int j = 0; j < n; j++) {
if(matrix.get(i).get(j) == 0) continue;
for(int k = 0; k < 4; k++) {
int x = i+dir[k][0];
int y = j+dir[k][1];
if(x < 0 || y < 0 || x >= m || y >= n) continue;
if(matrix.get(i).get(j) == matrix.get(x).get(y)) group++;
}
}
}
if(mark) System.out.println("-1");
else System.out.println(group/2);
} catch (IOException e) {
e.printStackTrace();
}
}
}