输入一个字符串,输出该字符串中相邻字符的所有组合。
举个例子,如果输入abc,它的组合有a、b、c、ab、bc、abc。(注意:输出的组合需要去重)(40分)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.TreeSet;
/**
* @author wylu
*/
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= str.length(); i++) {
TreeSet<String> sortedSet = new TreeSet<>();
for (int j = 0; j + i <= str.length(); j++) {
sortedSet.add(str.substring(j, j + i));
}
for (String s : sortedSet) {
sb.append(s).append(" ");
}
}
System.out.println(sb);
}
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNextLine()){
String s = in.nextLine();
TreeSet<String> set = new TreeSet<>(new Comparator<String>(){
public int compare(String s1,String s2){
if(s1.length()==s2.length())
return s1.compareTo(s2);
else
return s1.length()-s2.length();
}
});
for(int i=1;i<=s.length();i++){
int l=0,r=i;
while(r<=s.length()){
set.add(s.substring(l,r));
l++;
r++;
}
}
Iterator<String> it = set.iterator();
while(it.hasNext()){
System.out.print(it.next()+" ");
}
}
}
} #include <set>
#include <iostream>
using namespace std;
int main() {
string str;
cin >> str;
int n = str.length();
set<string> mySet;
for (size_t i = 1; i <= n; i++) //循环,根据长度取字符串
{
for (size_t j = 0; j <= n-i; j++)
{
string temp = str.substr(j, i);
mySet.insert(temp);
}
//输出
for (set<string>::iterator iter= mySet.begin(); iter != mySet.end(); iter++)
{
cout << *iter<<" ";
}
mySet.clear();
}
return 0;
} import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;
public class Main {
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String string=sc.next();
find(string);
}
private static void find(String string) {
int l=string.length();
TreeSet<String> set=new TreeSet<String>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if(o1.length()==o2.length()){
return o1.compareTo(o2);
}else{
return o1.length()-o2.length();
}
}
});
for(int i=1;i<=l;i++){
for(int j=0;j<i;j++){
set.add(string.substring(j,i));
}
}
for (String str : set) {
System.out.print(str+" ");
}
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String s = reader.readLine();
ArrayList<String> list = new ArrayList<>();//使用集合存储字符串
for (int i = 0; i < s.length(); i++) {
for (int j = i+1; j <= s.length(); j++) {
String str = s.substring(i, j);
if (!list.contains(str)) {//判断集合中是否存在重复的字符串
//将字符串添加到集合中
list.add(str);
}
}
}
//对集合中的字符串进行排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() == o2.length()) {
for (int i = 0; i < o1.length(); i++) {
if (o1.charAt(i) == o2.charAt(i)) {
continue;
}
return o1.charAt(i) - o2.charAt(i);
}
}
return o1.length()-o2.length();
}
});
for (String sub : list) {
System.out.print(sub+" ");
}
}
}
function neighbour(str) {
var newArr = []
for(var i = 1; i <= str.length; i++) {
for(var j = 0; j < str.length - i + 1; j++) {
var son = str.substring(j, j + i)
if(newArr.indexOf(son) === -1) {
newArr.push(son)
}
}
}
return newArr.join(' ')
}
print(neighbour(readline())) 有没有大佬帮忙看一下我这段代码是为什么不对,输出按照我的理解应该是对的……
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] in = sc.next().toCharArray(); int n = in.length;
TreeSet<String> set = new TreeSet<>(new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
if (o1.length() < o2.length()) { return -1;}
else if (o1.length() > o2.length()) {return 1;}
else {
return o1.compareTo(o2);
}
}
});
for (int i=1; i<=n; i++) {
for (int j=0; j+i<=n; j++) {
set.add(new String(in, j, i));
}
}
StringBuilder sb = new StringBuilder();
for (String s: set) {
sb.append(s);
sb.append(" ");
}
System.out.println(sb.toString());
}
}
python实现的思路,遍历长度为1,2,n的连续子串,遍历每个子串时将结果 加入一个临时列表temp时,遍历结束时,利用列表的sort()方法对临时列表 temp进行排序,并加入到结果列表中。 s = input() n = len(s) res = [] for i in range(1, n+1): temp = [] for j in range(n-i+1): s_t = s[j:j+i] if s_t not in temp : temp.append(s_t) temp.sort() res.extend(temp) res = ' '.join(res) res +=' ' print(res)
importjava.util.*;publicclassMain{publicstaticvoidmain(String args[]) {Scanner sc=newScanner(System.in);String str=sc.nextLine();Set<String> set=newHashSet<String>();char[] cstr=str.toCharArray();for(inti=1;i<cstr.length+1;i++){//循环 表示共有cstr长度种 长度的字符串for(intj=0;j<cstr.length-i+1;j++){//表示这个长度字符串有多少个StringBuilder sb=newStringBuilder();for(intk=j;k<i+j;k++){//组装字符串sb=sb.append(cstr[k]);}set.add(sb.toString());}}List<String> list=newArrayList<>();for(String value:set){list.add(value);}Collections.sort(list);for(inti=1;i<=cstr.length;i++) {for(String vl : list) {if(vl.length()==i) {System.out.print(vl + " ");}}}}}
#include<stdio.h>
#include<string>
#include<iostream>
#include<set>
#include<vector>
using namespace std;
int main(){
string in;
cin>>in;
int i,j,n=in.length();
vector<string> res;
for(i=1;i<=n;i++){
set<string> s;
for(j=0;j<=n-i;j++)
s.insert(in.substr(j,i).c_str());
for(set<string>::iterator it=s.begin();it!=s.end();it++)
res.push_back(*it);
}
if(res.size()==0) return 0;
printf("%s",res[0].c_str());
for(i=1;i<res.size();i++) printf(" %s",res[i].c_str());
printf(" \n");
}
注意,这道题贼坑。题目中说“每个组合以空格分隔”,但其实在结尾还要加一个空格才可以!!
首先要找到所有相邻字符串的列表。使用两层循环遍历即可。(还要去重)
多key排序。根据长度和字典序排序,在python中再简单不过。
六行:
string = input()
res = set()
for i in range(1, len(string) + 1):
for j in range(len(string) - i + 1):
res.add(string[j:j + i])
print(" ".join(sorted(list(res), key=lambda c: (len(c), c))))可以使用列表表达式简化成三行:
string = input()
res = {string[j:j + i] for i in range(1, len(string) + 1) for j in range(len(string) - i + 1)}
print(" ".join(sorted(list(res), key=lambda c: (len(c), c)))+" ")
#include <iostream>
#include <set>
using namespace std;
int main(int argc, char *argv[])
{
int i, j, len;
string s, s_tmp;
set<string> out;
set<string> :: iterator it;
cin >> s;
len = s.length();
for(i = 1; i <= len; i++)
{
for(j = 0; j + i - 1 < len; j++)
{
s_tmp = s.substr(j, i);
out.insert(s_tmp);
}
for(it = out.begin(); it != out.end(); it++)
{
cout << *it << " ";
}
out.clear();
}
cout << endl;
return 0;
}
在Subset的基础上进行 了一些小小的改动。
子串必须是相邻字符的组合,这点其实非常简单,直接利用 contains 方法判断即可。
输出组合必须去重,最初我想到的是利用Set来实现,但是其实也能通过List的contains方法来解决。
子串必须按照长度顺序排列,若长度相同则按照字典顺序排列。这个写一个比较器就能够 解决了。
详细代码如下:
(PS.写得非常直白,仅做一个抛砖引玉的作用~有更好的解法欢迎分享o(^▽^)o)
关于Subset这道题目可以在LintCode/LeetCode上找到,同样的解法和解释可以参见:
https://github.com/cherryljr/LintCode/blob/master/Subsets%20II.java
欢迎大家follow我( ▼-▼ )
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
if (str.length() <= 1) {
System.out.println(str);
}
List rst = new ArrayList();
helper(rst, new StringBuilder(), 0, str);
Collections.sort(rst, (a, b) -> a.length() == b.length()
? a.compareTo(b) : a.length() - b.length());
for (int i = 0; i < rst.size(); i++) {
System.out.print(rst.get(i) + " ");
}
}
public static void helper(List rst, StringBuilder sb, int start, String str) {
if (rst.contains(sb.toString())) {
return;
}
if (sb.length() == 1) {
rst.add(sb.toString());
} else if (sb.length() > 1 && str.contains(sb.toString())) {
rst.add(sb.toString());
}
for (int i = start; i < str.length(); i++) {
sb.append(str.charAt(i));
helper(rst, sb, i + 1, str);
sb.deleteCharAt(sb.length() - 1);
}
}
}
//TreeSet 既能够排序又能去重!
import java.util.Comparator;
import java.util.Scanner; import java.util.TreeSet;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.next();
TreeSet<String> set = new TreeSet<>(new StringLengthComparator());
for (int i = 0; i < str.length(); i++) {
for (int j = i + 1; j <= str.length(); j++) {
set.add(str.substring(i, j));
}
}
for (String i : set) {
System.out.print(i+" ");
}
}
}
// 定义比较器
class StringLengthComparator implements Comparator<Object> { @Override public int compare(Object o1, Object o2) {
String s1 = (String) o1;
String s2 = (String) o2;
int result = 0;
if (s1.length() > s2.length()) {
result = 1;
} else if (s1.length() < s2.length()) {
result = -1;
} else {
result = s1.compareTo(s2);
}
return result;
}
s = input()
ret = []
for i in range(len(s)):
ret_t = set()
for j in range(len(s) - i):
ret_t.add(s[j:j + i + 1])
ret.extend(sorted(list(ret_t)))
print(' '.join(ret))
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', function (line) {
const tokens = line.split(' ')[0];
// console.log(tokens);
let res = [];
for(let i = 0; i <= tokens.length;i++){
// res.push(tokens[i])
for(let j = 0; j <= tokens.length;j++){
let str = tokens.substr(i,j)
// console.log(i,j,str)
res.push(str)
}
}
let result =[]
for(let i = 0; i <= tokens.length;i++){
result[i] = Array.from(new Set(res)).filter(item=>item.length == i).sort().join(' ');
// console.log(result)
}
console.log(Array.from(new Set(result.join(' ').split(' '))).join(' ').trimStart())
}); package main
import (
"fmt"
"sort"
"strings"
)
func main() {
var s string
fmt.Scan(&s)
res := getStr(s)
sort.Slice(res, func(i, j int) bool {
return len(res[i]) < len(res[j])
})
sort.SliceStable(res, func(i, j int) bool {
if len(res[i]) == len(res[j]) {
return res[i]+res[j] < res[j]+res[i]
}
return false
})
fmt.Println(strings.Join(res, " "))
}
func getStr(s string) []string {
res := make([]string, 0)
m := make(map[string]bool)
for i := 0; i < len(s); i++ {
if !m[string(s[i])] {
res = append(res, string(s[i]))
m[string(s[i])] = true
}
for j := i + 1; j <= len(s); j++ {
if !m[s[i:j]] {
res = append(res, s[i:j])
m[s[i:j]] = true
}
}
}
return res
}
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int cmp(const void *s1, const void *s2)
{
char *a = (char *)s1;
char *b = (char *)s2;
if (strlen(a) > strlen(b)) {
return 1;
} else if (strlen(a) < strlen(b)) {
return -1;
} else {
return strcmp(a, b);
}
}
int main(int argc, char *argv[])
{
char res[100][100];
int row = 0;
char str[100];
scanf("%s", str);
if (strlen(str) <= 0) {
return 0;
}
for (int i = 0; i < strlen(str); ++i) {
char tmp[100];
int index = 0;
tmp[index++] = str[i];
tmp[index] = '\0';
strcpy(res[row++], tmp);
for (int j = i + 1; j < strlen(str); ++j) {
tmp[index++] = str[j];
tmp[index] = '\0';
strcpy(res[row++], tmp);
}
}
qsort(res, row, sizeof(res[0]), cmp);
printf("%s ", res[0]);
for (int i = 1; i < row; ++i) {
if (strcmp(res[i], res[i - 1]) != 0) {
printf("%s ", res[i]);
}
}
printf("\n");
return 0;
} import java.util.ArrayList;
import java.util.Scanner;
import java.util.TreeSet;
public class Mail {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNextLine()){
String str = input.nextLine();
ArrayList<TreeSet<String>> list = new ArrayList<TreeSet<String>>();
for(int i = 1; i <= str.length(); i++){
TreeSet<String> result = new TreeSet<String>();
for(int j = 0; j <= str.length() - i;j++){
result.add(str.substring(j,j + i));
}
list.add(result);
}
StringBuilder resultStr = new StringBuilder();
for(TreeSet<String> result : list){
for(String s : result){
resultStr.append(s);
resultStr.append(" ");
}
}
System.out.println(resultStr.toString().trim());
}
input.close();
}
}