字符串是否可由子串拼接

【编程题】

【题目来源】 给出一个非空的字符串,判断这个字符串是否是由它的一个子串进行多次首尾拼接构成的。
例如,"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);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值