Q1.8 Check if s2 is a rotation of s1

本文介绍了一种判断一个字符串是否为另一个字符串的旋转的方法。通过将原字符串拼接自身,然后使用isSubstring方法检查旋转后的字符串是否为拼接串的子串。此方法仅需一次子串检查,高效简洁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Q: Assume you have a method isSubstring which checks if one word is asubstring of another. Given two strings, s1 and s2, write code tocheck if s2 is a rotation of s1 using only one call to isSubstring (i.e., “waterbottle” is a rotation of “erbottlewat”).

A:

s = xy, 其中x、y分别是子串, 旋转之后s' = yx , 可以发现无论从什么位置开始旋转, yx永远是xyxy是的子串。

#include <iostream>
#include <string>
using namespace std;

bool isSubstring(string s, string t) {
	if (s.find(t) != string::npos) return true;
	else return false;
}
bool isRotation(string s1, string s2) {
	if (s1.length() != s2.length() || s1.length() < 1) {
		return false;
	}
	return isSubstring(s1+s1, s2);
}
int main() {
	string s1 = "waterbottle";
    string s2 = "erbottlewat";
    cout<<isRotation(s1, s2)<<endl;
}


针对包名com.mid.demo跳过签名验证,修改下面的方法: public static boolean verifySignatures(PackageSetting pkgSetting, @Nullable SharedUserSetting sharedUserSetting, PackageSetting disabledPkgSetting, SigningDetails parsedSignatures, boolean compareCompat, boolean compareRecover, boolean isRollback) throws PackageManagerException { final String packageName = pkgSetting.getPackageName(); boolean compatMatch = false; if (pkgSetting.getSigningDetails().getSignatures() != null) { // Already existing package. Make sure signatures match boolean match = parsedSignatures.checkCapability( pkgSetting.getSigningDetails(), SigningDetails.CertCapabilities.INSTALLED_DATA) || pkgSetting.getSigningDetails().checkCapability( parsedSignatures, SigningDetails.CertCapabilities.ROLLBACK); if (!match && compareCompat) { match = matchSignaturesCompat(packageName, pkgSetting.getSignatures(), parsedSignatures); compatMatch = match; } if (!match && compareRecover) { match = matchSignaturesRecover( packageName, pkgSetting.getSigningDetails(), parsedSignatures, SigningDetails.CertCapabilities.INSTALLED_DATA) || matchSignaturesRecover( packageName, parsedSignatures, pkgSetting.getSigningDetails(), SigningDetails.CertCapabilities.ROLLBACK); } if (!match && isApkVerificationForced(disabledPkgSetting)) { match = matchSignatureInSystem(packageName, pkgSetting.getSigningDetails(), disabledPkgSetting); } if (!match && isRollback) { // Since a rollback can only be initiated for an APK previously installed on the // device allow rolling back to a previous signing key even if the rollback // capability has not been granted. match = pkgSetting.getSigningDetails().hasAncestorOrSelf(parsedSignatures); } if (!match) { throw new PackageManagerException(INSTALL_FAILED_UPDATE_INCOMPATIBLE, "Existing package " + packageName + " signatures do not match newer version; ignoring!"); } } // Check for shared user signatures if (sharedUserSetting != null && sharedUserSetting.getSigningDetails() != SigningDetails.UNKNOWN) { // Already existing package. Make sure signatures match. In case of signing certificate // rotation, the packages with newer certs need to be ok with being sharedUserId with // the older ones. We check to see if either the new package is signed by an older cert // with which the current sharedUser is ok, or if it is signed by a newer one, and is ok // with being sharedUser with the existing signing cert. boolean match = canJoinSharedUserId(packageName, parsedSignatures, sharedUserSetting, pkgSetting.getSigningDetails().getSignatures() != null ? SHARED_USER_ID_JOIN_TYPE_UPDATE : SHARED_USER_ID_JOIN_TYPE_INSTALL); if (!match && compareCompat) { match = matchSignaturesCompat( packageName, sharedUserSetting.signatures, parsedSignatures); } if (!match && compareRecover) { match = matchSignaturesRecover(packageName, sharedUserSetting.signatures.mSigningDetails, parsedSignatures, SigningDetails.CertCapabilities.SHARED_USER_ID) || matchSignaturesRecover(packageName, parsedSignatures, sharedUserSetting.signatures.mSigningDetails, SigningDetails.CertCapabilities.SHARED_USER_ID); compatMatch |= match; } if (!match) { throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, "Package " + packageName + " has no signatures that match those in shared user " + sharedUserSetting.name + "; ignoring!"); } // If the lineage of this package diverges from the lineage of the sharedUserId then // do not allow the installation to proceed. if (!parsedSignatures.hasCommonAncestor( sharedUserSetting.signatures.mSigningDetails)) { throw new PackageManagerException(INSTALL_FAILED_SHARED_USER_INCOMPATIBLE, "Package " + packageName + " has a signing lineage " + "that diverges from the lineage of the sharedUserId"); } } return compatMatch; }
最新发布
08-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值