字符串是否由子串拼接-(招商银行2018)
2019-01-15 本文已影响0人
天使的流浪
题目:给出一个非空的字符串,判断这个字符串是否由它的一个子串进行多次首尾拼接构成的;
例如,"abcabcabc"由"abc"首尾拼接而成,而"abcab"则不满足条件;
说明:输入为非空字符串,输出:如果字符串满足上述条件,则输出最长的满足条件的字符串,如果不满足,则输出false;
输入:abcabc
输出:abc
分析:
从满足条件的结果出发:
① 满足条件的子串长度必须为字符串的公约数(即长度为6,最长子串的长度可以取3,2,1);
② 满足条件的子串与字符串对应位置匹配(即,sub_str[i]==str[i+L])
构造两层循环:
外层逆向遍历字符串(ans记录当前位置),内层正向遍历字符串(i记录当前位置);ans在整个过程中等同于子串的长度
(1) 在内层寻找合适的子串长度:i%ans==0
(2) 内层循环遍历判断对应位置是否相等:str.charAt(i)==str.charAt(i%ans)
(3)限制条件:i<str.length()
当:str.length()==i时,证明对应位置均完成匹配,即找到当前的子串,对应输出子串;否则输出False;
代码实现:
package com.bj.zhaoshang;
import java.util.Scanner;
/**
* 字符串是否由子串拼接
*
*/
public class Test1 {
@SuppressWarnings("resource")
public static void main(String[] args) {
String str = new Scanner(System.in).nextLine();
int ans = str.length()-1;
for (; ans >0; ans--) {
int i = 0;
for (; str.length()%ans==0 && i<str.length() && str.charAt(i)==str.charAt(i%ans);i++) {
//System.out.println(i);
}
if (str.length()==i) {
break;
}
}
if(ans!=0){
System.out.println(str.substring(0, ans));
}else{
System.out.println("False");
}
}
}
知识点:
1.字符串的读取、求长度、截取等基本操作;
2.问题的转化;