# -*- coding: utf-8 -*-
'''
Python程序员面试算法宝典---解题总结: 第5章 5.22 如何求相对路径
题目:
编写一个函数,根据两个文件的绝对路径计算出其相对路径。
例如
a="/qihoo/app/a/b/c/d/new.c",
b="/qihoo/app/1/2/test.c"
那么b相对于a的;就是
"../../../../1/2/test.c"
分析:
最简单的方式先找到两个路径的最长前缀公共路径
然后对路径a用/划分,划分得到的列表长度-1即为
'../'应该出现的次数,再拼接上b中除最长前缀
公共路径剩余的部分
关键:
参考:
Python程序员面试算法宝典
'''
"""
计算需要在相对路径前面添加的"../"
的个数,和字符串b剩余的内容
"""
def getRelatedNumAndRemainedStr(a, b):
if not a or not b:
return ""
aList = a.split("/")
bList = b.split("/")
aLen = len(aList)
bLen = len(bList)
size = min(aLen, bLen)
for i in range(size):
if aList[i] != bList[i]:
break
# 接下来计算 "../"的个数,现在i表示的是第一次两者不同的位置,
# 也是相同元素的个数
relatedNum = aLen - i - 1
remained = "/".join(bList[i:])
return relatedNum, remained
def getRelatedPath(a, b):
if not a or not b:
return ""
relatedNum, remained = getRelatedNumAndRemainedStr(a, b)
related = ""
for i in range(relatedNum):
related += "../"
result = related + remained
return result
def process():
a = "/qihoo/app/a/b/c/d/new.c"
b = "/qihoo/app/1/2/test.c"
result = getRelatedPath(a, b)
print result
if __name__ == "__main__":
process()