【面试题】拼接字符串

今天面试官给出了一道题,判断字符串s是否能够由arr中的元素组合拼接组成。

输入示例:

s="aabbcc"

arr=["a","abb","c"]

其实还挺简单的递归法的题目,太紧张然后写错边界条件。

递归法两个注意点:

1.字符串的边界条件

2.遍历过程中只要有一次true,最后结果就是true

时间复杂度:O(n)

空间复杂度:O(1)

代码如下:

class Solution(object):
    def mergeStr(self,s,arr):
        if len(s)==0:
            return True
        start=0
        flag=False
        for i in range(1,len(s)+1):
            cur=s[start:i]
            if cur in arr:
                res=self.mergeStr(s[i:],arr)
                if res:
                    flag=res
        return flag

if __name__=='__main__':
    s="aabbcc"
    arr=["a","abb","cc"]
    solution=Solution()
    res=solution.mergeStr(s,arr)
    print(res)

其实和找零钱挺像的,但是太紧张了。边界条件其实面试时发现错了,i属于[1,len(s)+1),但面试官小姐姐一质疑就不敢改了。交流还是很重要。

更新:在Leetcode上找到这个题,发现回溯法是会超时的

更新动态规划法:

时间复杂度:O(n^2)

空间复杂度:O(n)

class Solution(object):
    def wordBreak(self, s, wordDict):
        """
        :type s: str
        :type wordDict: List[str]
        :rtype: bool
        """
        dp=[False for _ in range(len(s)+1)]
        dp[0]=True
        for i in range(len(s)+1):
            for j in range(i):
                if dp[j] and s[j:i] in wordDict:
                    dp[i]=True
                    break
        return dp[-1]

Java字符串面试题通常涉及到String、StringBuilder和StringBuffer类的使用,以下是一些常见的问题和答案: 1. String、StringBuilder和StringBuffer有什么区别? - String是不可变的字符序列,每次对String进行修改都会创建一个新的String对象,因此在频繁修改字符串时效率较低。 - StringBuilder和StringBuffer都是可变的字符序列,可以在原有对象上进行修改,因此在频繁修改字符串时效率较高。StringBuilder是非线程安全的,而StringBuffer是线程安全的。 2. String str="i"与 String str=new String("i")一样吗? - 不完全一样。String str="i"会先在常量池中查找是否存在值为"i"的字符串,如果存在则直接返回该字符串的引用;如果不存在则在常量池中创建一个新的字符串"i",并返回该字符串的引用。而String str=new String("i")则会在堆内存中创建一个新的字符串对象,并将该对象的引用赋值给str。 3. 如何将字符串转换为字节数组? - 可以使用getBytes()方法,例如: ```java String str = "hello"; byte[] bytes = str.getBytes(); ``` 4. 如何将字符串转换为字符数组? - 可以使用toCharArray()方法,例如: ```java String str = "hello"; char[] chars = str.toCharArray(); ``` 5. 如何将字符数组转换为字符串? - 可以使用String的valueOf()方法,例如: ```java char[] chars = {'h', 'e', 'l', 'l', 'o'}; String str = String.valueOf(chars); ``` 6. 如何将字符串转换为小写或大写? - 可以使用toLowerCase()和toUpperCase()方法,例如: ```java String str = "Hello"; String lowerStr = str.toLowerCase(); // 输出:hello String upperStr = str.toUpperCase(); // 输出:HELLO ``` 7. 如何将两个字符串拼接起来? - 可以使用concat()方法或"+"运算符,例如: ```java String str1 = "hello"; String str2 = "world"; String str3 = str1.concat(str2); // 输出:helloworld String str4 = str1 + str2; // 输出:helloworld ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值