1.字符串是否由子串拼接
题目描述
给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
输入描述:
非空字符串
输出描述:
如果字符串满足上述条件,则输出最长的满足条件的的子串;如果不满足条件,则输出false。
输入例子1:
abcabc
输出例子1:
abc
思路
最少两个子串构成字符串,子串长度最大是字符串长度的一半,所以从中间位置i开始向前遍历, 每次从0截取到i的子串,再将字符串中该子串全部替换成空串
替换完一次后,判断当前字符串是否变成空串:为空串则找到了最长的子串;不为空继续向前遍历
实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
/*最少两个子串构成字符串,子串长度最大是字符串长度的一半,所以从中间位置i开始向前遍历,
每次从0截取到i的子串,再将字符串中该子串全部替换成空串
替换完一次后,判断当前字符串是否变成空串:为空串则找到了最长的子串;不为空继续向前遍历
*/
int i=s.length()/2;
for(;i>0;i--){
//截取子串
String sub=s.substring(0,i);
//将字符串中的sub全部替换为空串,判断字符串是否变成空串
if(s.replaceAll(sub,"").length()==0){
System.out.println(sub);
return; //找到最大子串,跳出程序
}
}
//找不到满足条件的子串
System.out.println("false");
}
}
2.寻找合法字符串
题目描述
给出一个正整数n,请给出所有的包含n个’(‘和n个’)‘的字符串,使得’(‘和’)‘可以完全匹配。
例如:
‘(())()’,’()()()’ 都是合法的;
'())()('是不合法的。
请按照__字典序__给出所有合法的字符串。
输入描述:
输入为1个正整数
输出描述:
输出为所有合法的字符串,用英文逗号隔开
输入例子1:
2
输出例子1:
(()),()()
思路
回溯.
leetcode第22题:括号生成
实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
ArrayList<String> res=new ArrayList<>();
backTrace(res,"",0,0,n);
//按规定格式输出
for(int i=0;i<res.size()-1;i++){
System.out.print(res.get(i)+",");
}
//最后一个单独输出
System.out.print(res.get(res.size()-1));
}
//回溯(cur:当前待添加括号的字符串、open:当前cur中开括号个数、close:当前cur中闭括号个数、n:开/闭括号的总数)
public static void backTrace(ArrayList<String> res,String cur,int open,int close,int n){
//递归出口(当前字符串的长度==开闭括号数之和,就把字符串加到结果集中)
if(cur.length()==n*2){
res.add(cur);
}
//若开括号没加满n个,继续加开括号
if(open<n){
backTrace(res,cur+"(",open+1,close,n);
}
//若闭括号少于开括号,继续向当前字符串中加闭括号
if(close<open){
backTrace(res,cur+")",open,close+1,n);
}
}
}
3.整数成绩最大化
题目描述
给出一个整数n,将n分解为至少两个整数之和,使得这些整数的乘积最大化,输出能够获得的最大的乘积。
例如:
2=1+1,输出1;
10=3+3+4,输出36。
输入描述:
输入为1个整数
输出描述:
输出为1个整数
输入例子1:
10
输出例子1:
36
思路
贪心法,类似剑指offer剪绳子题(也可以动态规划,但本题贪心法较优)
实现
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
Main m=new Main();
System.out.println(m.greedy(n));
}
//贪心法,类似剑指offer剪绳子:尽量剪出最多的3,如果n不能除尽3,最后一个4要分成2*2
public int greedy(int n){
if(n<=1) return 0;
if(n==2) return 1;
if(n==3) return 2;
int timeOf3=n/3;
if(n%3==1){
timeOf3--;
}
int timeOf2=(n-timeOf3*3)/2;
return ((int)Math.pow(3,timeOf3))* ((int)Math.pow(2,timeOf2));
}
}