【编程题】
【题目来源】 给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
输入描述: 非空字符串
输出描述: 如果字符串满足上述条件,则输出最长的满足条件的的子串;如果不满足条件,则输出false。
输入示例
abcabc
输出示例
abc
解题思路:
因为需要找的是最长的拼接子串sub_str,所以子串长度从原始字符串src_str.length()-1开始遍历,如果该子串能拼接成src_str,那么src_str的长度肯定是sub_str长度的整数倍。循环截取判断字符串与子串的是否相等,相等则输出当前子串。
C/C++版
#include <iostream>
#include <string>
using namespace std;
void Solve(string srcStr)
{
int res = srcStr.length() - 1;
for (; res > 0; res--) // 子串的长度,因为要求最大拼接子串,从大到小进行递减
{
bool isRes = false; //是否是拼接子串
string subString = srcStr.substr(0, res); //当前拼接子串
if (srcStr.length() % res == 0) // 如果是拼接子串的话,那么拼接子串长度肯定能够整除整个字符串
{
for (int i = 0; i < srcStr.length(); i += res) // 步长为拼接子串的长度
{
if (subString == srcStr.substr(i, res)) // 子串比较
{
isRes = true;
}
else
{
isRes = false; // 如果不匹配的话说明当前子串不是拼接子串
break;
}
}
}
if (isRes)
{
cout << subString << endl;
return;
}
}
cout << "false" << endl;
}
int main()
{
string srcStr = "abcabcab";
cin >> srcStr;
Solve(srcStr);
system("pause");
return 0;
}
java版
import java.util.Scanner;
/**
* Time: 2019-01-24 Author: snowy
* 招商银行信用卡中心秋招: 字符串是否由子串拼接
* 链接:https://www.nowcoder.com/questionTerminal/6e3ff5d892c342ae8f367355b66bab55
* 来源:牛客网
*
* 【题目来源】 给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
* 例如,"abcabcabc"满足条件,因为它是由"abc"首尾拼接而成的,而"abcab"则不满足条件。
*
* 输入描述: 非空字符串
* 输出描述: 如果字符串满足上述条件,则输出最长的满足条件的的子串;如果不满足条件,则输出false。
* */
public class SubStringJoint {
public static void subStringJoint(String src_string){
int res_len = src_string.length() - 1;
for (int i = 0; res_len > 0; res_len --) { // 子串的长度,因为要求最大拼接子串,从大到小进行递减
if (src_string.length() % res_len == 0) { // 如果是拼接子串的话,那么拼接子串长度肯定能够整除整个字符串
for (i = 0; i < src_string.length() && src_string.charAt(i) == src_string.charAt(i % res_len); i ++) {} // 子串比较
if (i == src_string.length())
break;
}
}
System.out.println(res_len != 0 ? src_string.substring(0, res_len) : "false");
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while(input.hasNext()) {
String src_string = input.next();
subStringJoint(src_string);
}
}
}