NC114:旋转字符串
旋转字符串
http://www.nowcoder.com/questionTerminal/80b6bb8797644c83bc50ac761b72981c
解法1:暴力求解
直接模拟即可:枚举旋转了几位,然后求出旋转后的字符串,比较是否与原字符串相同。
注意一下,如果两个字符串长度不同,无论如何旋转都不可能相同的,直接返回false。
public boolean solve (String A, String B) { // write code here int a=A.length(); int b=B.length(); if(A==null && B==null){ return true; } if(A==null || B==null || a!=b){ return false; } int n = A.length(); char[] ch=A.toCharArray(); for (int i = 1; i < n; ++i) { String tmp=""; for (int j = i; j < n; ++j) tmp += ch[j]; for (int j = 0; j < i; ++j) tmp += ch[j]; if (tmp.equals(B)) return true; } return false; }
解法2:(A+A).contains(B);
1、假如 A="abcd" 则 A+A = "abcdabcd"
2、如果B 满足 题目的条件,则B 一定属于 A+A 里面的一个子串
public boolean solve (String A, String B) { // write code here int a=A.length(); int b=B.length(); if(A==null && B==null){ return true; } if(A==null || B==null || a!=b){ return false; } return (A+A).contains(B); }
解法3:B中是否同时包含 head和tail 两部分
1、A和B长度不等,则返回 false
2、A个B长度相等,不断的切割 A为head和tail 两部分
3、如果B中同时包含 head和tail 两部分,则返回true
4、如果一直没找到,则返回false
public boolean solve (String A, String B) { // write code here int a=A.length(); int b=B.length(); if(A==null && B==null){ return true; } if(A==null || B==null || a!=b){ return false; } int i=1; while(i<a){ String headStr = A.substring(0,i); String tailStr = A.substring(i); if(B.contains(headStr)&&B.contains(tailStr)){ return true; } i++; } return false; }
名企高频面试算法题解 文章被收录于专栏
牛客题霸 - 程序员面试高频题 - 题解