Chapter 1 Arrays and Strings - 1.8

Problem 1.8: Assume you have a method isSubString which checks if one word is a substring of another. Given two strings, s1 and s2, write code to check if s2 is a rotation of s1 using only one call to isSubString (i.e. "waterbottle" is a rotation of "erbottlewat")

It's very important that how you understand the concept "rotation". In my eyes, you just shift the word and the letters go out of range will appear at the other end. This kind of understanding is not helpful and I didn't know why I need the isSubString to solve the problem.

An ACM guy told me his understanding and it is a great one: you just concatenate the string with itself on both side, and then pick a segment from the new string. If length of the segment is the same as original string (before concatenation), you will get a rotation of original string.

Based on the better understanding, the algorith has just two step:
1) Check whether the lengths of two string are the same.
2) Concatenate one string and check whether the other one is a substring of the concatenation.

import string

def isSubstring(substr, str):
    for i in range(0, len(str)-len(substr)+1):
        if substr[0] == str[i]:
            is_substr = True
            for j in range(0, len(substr)):
                if substr[j] != str[i+j]:
                    is_substr = False
            if True == is_substr:
                return True
    return False

def is_rotation(str1, str2):
    # 1. Check the length
    if len(str1) != len(str2):
        return False
    
    # 2. Concatenate str1
    concatenation_str = str1+str1
    print concatenation_str

    # 3. Check whether str2 is a substring of
    # the concatenation
    return isSubstring(str2, concatenation_str)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值